Version 2.1.1: Binaries for ARM64, proper macOS bundles, minor bugfixes.

Closes #2
Closes #42
Closes #59

PiperOrigin-RevId: 416794598
Change-Id: I1306df1127d6acecf2323873c0da0910f35d31a0
This commit is contained in:
Saran Tunyasuvunakool
2021-12-16 14:36:53 +00:00
parent 4bf5630558
commit a499b38120
49 changed files with 6055 additions and 5712 deletions
+100 -98
View File
@@ -12,135 +12,137 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "mujoco.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <cctype>
#include <cstddef>
#include <cstdio>
#include <cstring>
#include "mujoco.h"
// help
const char helpstring[] =
"\n Usage: compile infile outfile\n"
" infile can be in mjcf, urdf, mjb format\n"
" outfile can be in mjcf, mjb, txt format\n\n"
" Example: compile model.xml model.mjb\n";
"\n Usage: compile infile outfile\n"
" infile can be in mjcf, urdf, mjb format\n"
" outfile can be in mjcf, mjb, txt format\n\n"
" Example: compile model.xml model.mjb\n";
// deallocate and print message
int finish(const char* msg = 0, mjModel* m = 0)
{
// deallocated everything
if( m )
mj_deleteModel(m);
int finish(const char* msg = 0, mjModel* m = 0) {
// deallocated everything
if (m) {
mj_deleteModel(m);
}
// print message
if( msg )
printf("%s\n", msg);
// print message
if (msg) {
std::printf("%s\n", msg);
}
return 0;
return 0;
}
// possible file types
enum
{
typeUNKNOWN = 0,
typeXML,
typeMJB,
typeTXT
enum {
typeUNKNOWN = 0,
typeXML,
typeMJB,
typeTXT
};
// determine file type
int filetype(const char* filename)
{
// convert to lower case for string comparison
char lower[1000];
size_t i=0;
while( i<strlen(filename) && i<999 )
{
lower[i] = (char)tolower(filename[i]);
i++;
}
lower[i] = 0;
int filetype(const char* filename) {
// convert to lower case for string comparison
char lower[1000];
std::size_t i=0;
while (i<std::strlen(filename) && i<999) {
lower[i] = (char)tolower(filename[i]);
i++;
}
lower[i] = 0;
// find last dot
int dot = (int)strlen(lower);
while( dot>=0 && lower[dot]!='.' )
dot--;
// find last dot
int dot = (int)std::strlen(lower);
while (dot>=0 && lower[dot]!='.') {
dot--;
}
// no dot found
if( dot<0 )
return typeUNKNOWN;
// no dot found
if (dot<0) {
return typeUNKNOWN;
}
// check extension
if( !strcmp(lower+dot, ".xml") || !strcmp(lower+dot, ".urdf") )
return typeXML;
else if( !strcmp(lower+dot, ".mjb") )
return typeMJB;
else if( !strcmp(lower+dot, ".txt") )
return typeTXT;
else
return typeUNKNOWN;
// check extension
if (!std::strcmp(lower+dot, ".xml") || !std::strcmp(lower+dot, ".urdf")) {
return typeXML;
} else if (!std::strcmp(lower+dot, ".mjb")) {
return typeMJB;
} else if (!std::strcmp(lower+dot, ".txt")) {
return typeTXT;
} else {
return typeUNKNOWN;
}
}
// main function
int main(int argc, const char** argv)
{
// model and error
mjModel* m = 0;
char error[1000];
int main(int argc, const char** argv) {
// model and error
mjModel* m = 0;
char error[1000];
// print help if arguments are missing
if( argc!=3 )
return finish(helpstring);
// print help if arguments are missing
if (argc!=3) {
return finish(helpstring);
}
// determine file types
int type1 = filetype(argv[1]);
int type2 = filetype(argv[2]);
// determine file types
int type1 = filetype(argv[1]);
int type2 = filetype(argv[2]);
// check types
if( type1==typeUNKNOWN || type1==typeTXT ||
type2==typeUNKNOWN || (type1==typeMJB && type2==typeXML) )
return finish("Illegal combination of file formats");
// check types
if (type1==typeUNKNOWN || type1==typeTXT ||
type2==typeUNKNOWN || (type1==typeMJB && type2==typeXML)) {
return finish("Illegal combination of file formats");
}
// make sure output file does not exist
FILE* fp = fopen(argv[2], "r");
if( fp )
{
fclose(fp);
return finish("Output file already exists");
// make sure output file does not exist
std::FILE* fp = std::fopen(argv[2], "r");
if (fp) {
std::fclose(fp);
return finish("Output file already exists");
}
// load model
if (type1==typeXML) {
m = mj_loadXML(argv[1], 0, error, 1000);
} else {
m = mj_loadModel(argv[1], 0);
}
// check error
if (!m) {
if (type1==typeXML) {
return finish(error, 0);
} else {
return finish("Could not load model", 0);
}
}
// load model
if( type1==typeXML )
m = mj_loadXML(argv[1], 0, error, 1000);
else
m = mj_loadModel(argv[1], 0);
// check error
if( !m )
{
if( type1==typeXML )
return finish(error, 0);
else
return finish("Could not load model", 0);
// save model
if (type2==typeXML) {
if (mj_saveLastXML(argv[2], m, error, 1000)) {
return finish(error, m);
}
} else if (type2==typeMJB) {
mj_saveModel(m, argv[2], 0, 0);
} else {
mj_printModel(m, argv[2]);
}
// save model
if( type2==typeXML )
{
if( mj_saveLastXML(argv[2], m, error, 1000) )
return finish(error, m);
}
else if( type2==typeMJB )
mj_saveModel(m, argv[2], 0, 0);
else
mj_printModel(m, argv[2]);
// finalize
return finish("Done", m);
// finalize
return finish("Done", m);
}