@@ -989,14 +989,6 @@ bool mjCFlexcomp::MakeMesh(mjCModel* model, char* error, int error_sz) {
989
989
return comperr (error, " File is required" , error_sz);
990
990
}
991
991
992
- // get extension and check; must be STL, OBJ or MSH
993
- std::string ext = mjuu_getext (file);
994
- if (strcasecmp (ext.c_str (), " .stl" ) &&
995
- strcasecmp (ext.c_str (), " .obj" ) &&
996
- strcasecmp (ext.c_str (), " .msh" )) {
997
- return comperr (error, " Mesh file extension must be stl, obj or msh" , error_sz);
998
- }
999
-
1000
992
// check dim
1001
993
if (def.spec .flex ->dim < 2 ) {
1002
994
return comperr (error, " Flex dim must be at least 2 for mesh" , error_sz);
@@ -1006,53 +998,36 @@ bool mjCFlexcomp::MakeMesh(mjCModel* model, char* error, int error_sz) {
1006
998
std::string filename = mjuu_combinePaths (mjs_getString (model->spec .meshdir ), file);
1007
999
mjResource* resource = nullptr ;
1008
1000
1001
+
1002
+ if (mjCMesh::IsMSH (filename)) {
1003
+ return comperr (error, " legacy MSH files are not supported in flexcomp" , error_sz);
1004
+ }
1005
+
1009
1006
try {
1010
1007
resource = mjCBase::LoadResource (mjs_getString (model->spec .modelfiledir ),
1011
1008
filename, 0 );
1012
1009
} catch (mjCError err) {
1013
1010
return comperr (error, err.message , error_sz);
1014
1011
}
1015
1012
1013
+
1016
1014
// load mesh
1017
1015
mjCMesh mesh;
1018
- bool isobj = false ;
1019
1016
try {
1020
- if (!strcasecmp (ext.c_str (), " .stl" )) {
1021
- mesh.LoadSTL (resource);
1022
- } else if (!strcasecmp (ext.c_str (), " .obj" )) {
1023
- isobj = true ;
1024
- mesh.LoadOBJ (resource);
1025
- } else {
1026
- mesh.LoadMSH (resource);
1027
- }
1017
+ mesh.LoadFromResource (resource, true );
1028
1018
mju_closeResource (resource);
1029
1019
} catch (mjCError err) {
1030
1020
mju_closeResource (resource);
1031
1021
return comperr (error, err.message , error_sz);
1032
1022
}
1033
1023
1034
- // LoadOBJ uses userXXX, extra processing needed
1035
- if (isobj) {
1036
- // check sizes
1037
- if (mesh.Vert ().empty () || mesh.Face ().empty ()) {
1038
- return comperr (error, " Vertex and face data required" , error_sz);
1039
- }
1040
- if (mesh.Vert ().size ()%3 ) {
1041
- return comperr (error, " Vertex data must be multiple of 3" , error_sz);
1042
- }
1043
- if (mesh.Face ().size ()%3 ) {
1044
- return comperr (error, " Face data must be multiple of 3" , error_sz);
1045
- }
1046
-
1047
- // remove repeated vertices (not called in LoadOBJ)
1048
- mesh.RemoveRepeated ();
1024
+ // check sizes
1025
+ if (mesh.Vert ().empty () || mesh.Face ().empty ()) {
1026
+ return comperr (error, " Vertex and face data required" , error_sz);
1049
1027
}
1050
1028
1051
- // copy vertices, convert from float to double
1052
- point = vector<double > (mesh.nvert ()*3 );
1053
- for (int i=0 ; i < mesh.nvert ()*3 ; i++) {
1054
- point[i] = (double ) mesh.Vert (i);
1055
- }
1029
+ // copy vertices
1030
+ point = mesh.Vert ();
1056
1031
1057
1032
if (mesh.HasTexcoord ()) {
1058
1033
texcoord = mesh.Texcoord ();
0 commit comments