Do not render flexes/skins with no geometry.

PiperOrigin-RevId: 933604372
Change-Id: I80169ff09ec6908d101b5f10bbf8aa1a6e8b8249
This commit is contained in:
Haroon Qureshi
2026-06-17 02:53:26 -07:00
committed by Copybara-Service
parent e1711529f2
commit 6294e77907
3 changed files with 16 additions and 6 deletions
@@ -126,8 +126,10 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
}
if (geom->type == mjGEOM_FLEX || geom->type == mjGEOM_SKIN) {
scene_objects_->CreateSkinFlexMesh(scene, model_objects_->GetModel(),
*geom);
if (!scene_objects_->CreateSkinFlexMesh(scene, model_objects_->GetModel(),
*geom)) {
continue;
}
}
UniquePtr<mjrfRenderable> renderable = CreateGeomRenderable(
@@ -103,9 +103,13 @@ static std::span<const int> GetIndices(const mjModel* model,
}
}
static void UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model,
static bool UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model,
const mjvScene* scene, const mjvGeom& geom) {
auto positions = GetPositions(model, scene, geom);
if (positions.empty()) {
return false;
}
auto normals = GetNormals(model, scene, geom);
auto uvs = GetUvs(model, scene, geom);
auto indices = GetIndices(model, scene, geom);
@@ -133,16 +137,19 @@ static void UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model,
data->compute_bounds = true;
data->release = nullptr;
data->user_data = nullptr;
return true;
}
SceneObjects::SceneObjects(mjrfContext* ctx) : ctx_(ctx) {}
void SceneObjects::CreateSkinFlexMesh(const mjvScene* scene,
bool SceneObjects::CreateSkinFlexMesh(const mjvScene* scene,
const mjModel* model,
const mjvGeom& geom) {
mjrfMeshData data;
mjrf_defaultMeshData(&data);
UpdateSkinFlexMeshData(&data, model, scene, geom);
if (!UpdateSkinFlexMeshData(&data, model, scene, geom)) {
return false;
}
if (geom.type == mjGEOM_FLEX) {
flexes_.insert_or_assign(geom.objid, CreateMesh(ctx_, data));
} else if (geom.type == mjGEOM_SKIN) {
@@ -150,6 +157,7 @@ void SceneObjects::CreateSkinFlexMesh(const mjvScene* scene,
} else {
mju_error("Unsupported dynamic mesh type: %d", geom.type);
}
return true;
}
const mjrfMesh* SceneObjects::GetFlexMesh(int geom_id) const {
@@ -30,7 +30,7 @@ class SceneObjects {
explicit SceneObjects(mjrfContext* ctx);
// Creates a skin or flex mesh from the given geom in the mjvScene.
void CreateSkinFlexMesh(const mjvScene* scene, const mjModel* model,
bool CreateSkinFlexMesh(const mjvScene* scene, const mjModel* model,
const mjvGeom& geom);
// Returns the mesh for the given geom id, as created by CreateSkinFlexMesh.