@@ -103,8 +103,11 @@ static std::span<const int> GetIndices(const mjModel* model,
103103 }
104104}
105105
106- static bool UpdateSkinFlexMeshData (mjrfMeshData* data, const mjModel* model,
107- const mjvScene* scene, const mjvGeom& geom) {
106+ SceneObjects::SceneObjects (mjrfContext* ctx) : ctx_(ctx) {}
107+
108+ bool SceneObjects::CreateSkinFlexMesh (const mjvScene* scene,
109+ const mjModel* model,
110+ const mjvGeom& geom) {
108111 auto positions = GetPositions (model, scene, geom);
109112 if (positions.empty ()) {
110113 return false ;
@@ -119,41 +122,44 @@ static bool UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model,
119122 num_indices = 3 * scene->flexfaceused [geom.objid ];
120123 }
121124
122- data->num_attributes = uvs.data () ? 3 : 2 ;
123- data->attributes [0 ].usage = mjVERTEX_ATTRIBUTE_USAGE_POSITION;
124- data->attributes [0 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT3;
125- data->attributes [0 ].bytes = positions.data ();
126- data->attributes [1 ].usage = mjVERTEX_ATTRIBUTE_USAGE_NORMAL;
127- data->attributes [1 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT3;
128- data->attributes [1 ].bytes = normals.data ();
129- data->attributes [2 ].usage = mjVERTEX_ATTRIBUTE_USAGE_UV;
130- data->attributes [2 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT2;
131- data->attributes [2 ].bytes = uvs.data ();
132- data->num_vertices = positions.size () / 3 ;
133- data->num_indices = num_indices;
134- data->indices = indices.data ();
135- data->index_type = mjINDEX_TYPE_U32;
136- data->primitive_type = mjMESH_PRIMITIVE_TYPE_TRIANGLES;
137- data->compute_bounds = true ;
138- data->release = nullptr ;
139- data->user_data = nullptr ;
140- return true ;
141- }
142-
143- SceneObjects::SceneObjects (mjrfContext* ctx) : ctx_(ctx) {}
125+ mjrfMeshConfig config;
126+ mjrf_defaultMeshConfig (&config);
127+ config.num_attributes = uvs.data () ? 3 : 2 ;
128+ config.attributes [0 ].usage = mjVERTEX_ATTRIBUTE_USAGE_POSITION;
129+ config.attributes [0 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT3;
130+ config.attributes [1 ].usage = mjVERTEX_ATTRIBUTE_USAGE_NORMAL;
131+ config.attributes [1 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT3;
132+ config.attributes [2 ].usage = mjVERTEX_ATTRIBUTE_USAGE_UV;
133+ config.attributes [2 ].type = mjVERTEX_ATTRIBUTE_TYPE_FLOAT2;
134+ config.max_vertices = positions.size () / 3 ;
135+ config.max_indices = num_indices;
136+ config.index_type = mjINDEX_TYPE_U32;
137+ config.primitive_type = mjMESH_PRIMITIVE_TYPE_TRIANGLES;
144138
145- bool SceneObjects::CreateSkinFlexMesh (const mjvScene* scene,
146- const mjModel* model,
147- const mjvGeom& geom) {
148139 mjrfMeshData data;
149140 mjrf_defaultMeshData (&data);
150- if (!UpdateSkinFlexMeshData (&data, model, scene, geom)) {
151- return false ;
152- }
141+ data.vertices [0 ] = positions.data ();
142+ data.vertices [1 ] = normals.data ();
143+ data.vertices [2 ] = uvs.data ();
144+ data.num_vertices = positions.size () / 3 ;
145+ data.num_indices = num_indices;
146+ data.indices = indices.data ();
147+ data.compute_bounds = true ;
148+ data.release = nullptr ;
149+ data.user_data = nullptr ;
150+
153151 if (geom.type == mjGEOM_FLEX) {
154- flexes_.insert_or_assign (geom.objid , CreateMesh (ctx_, data));
152+ auto iter = flexes_.find (geom.objid );
153+ if (iter == flexes_.end ()) {
154+ iter = flexes_.insert ({geom.objid , CreateMesh (ctx_, config)}).first ;
155+ }
156+ mjrf_setMeshData (iter->second .get (), &data);
155157 } else if (geom.type == mjGEOM_SKIN) {
156- skins_.insert_or_assign (geom.objid , CreateMesh (ctx_, data));
158+ auto iter = skins_.find (geom.objid );
159+ if (iter == skins_.end ()) {
160+ iter = skins_.insert ({geom.objid , CreateMesh (ctx_, config)}).first ;
161+ }
162+ mjrf_setMeshData (iter->second .get (), &data);
157163 } else {
158164 mju_error (" Unsupported dynamic mesh type: %d" , geom.type );
159165 }
0 commit comments