Minor cleanup to scene_geom_util.

PiperOrigin-RevId: 915367694
Change-Id: Ia20c3ba050d9f364da5c26f0812bf9a9c5763cd6
This commit is contained in:
Haroon Qureshi
2026-05-14 04:54:00 -07:00
committed by Copybara-Service
parent c587cea0f7
commit 9c372fbbea
5 changed files with 64 additions and 84 deletions
@@ -46,30 +46,9 @@ static bool IsBehind(const float* headpos, const float* pos, const float* mat) {
0.0f);
}
static const mjrMesh* GetMesh(ModelObjects* model_objs, int data_id) {
const mjrMesh* mesh = model_objs->GetMeshBuffer(data_id);
if (mesh == nullptr) {
mju_error("Unknown mesh %d", data_id);
}
return mesh;
}
static const mjrMesh* GetSkinFlexMesh(ModelObjects* model_objs, int objid) {
return model_objs->GetFlexSkinGeomMesh(objid);
}
static const mjrMesh* GetHeightField(ModelObjects* model_objs, int hfield_id) {
const mjrMesh* mesh = model_objs->GetHeightFieldBuffer(hfield_id);
if (mesh == nullptr) {
mju_error("Unknown height field %d", hfield_id);
}
return mesh;
}
static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom,
const mjvScene* scene,
ModelObjects* model_objects) {
const mjModel* model = model_objects->GetModel();
ModelObjects* model_objs) {
const mjModel* model = model_objs->GetModel();
const int nstack = model->vis.quality.numstacks;
const int nslice = model->vis.quality.numslices;
const int nquad = model->vis.quality.numquads;
@@ -81,24 +60,25 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom,
float size[3];
std::memcpy(size, &geom.size, 3 * sizeof(float));
switch ((mjtGeom)geom.type) {
const mjtGeom geom_type = (mjtGeom)geom.type;
switch (geom_type) {
case mjGEOM_MESH:
case mjGEOM_SDF:
mjrf_setRenderableMesh(renderable, GetMesh(model_objects, geom.dataid), 0, 0);
mjrf_setRenderableMesh(renderable, model_objs->GetMesh(geom.dataid), 0, 0);
// Ignore size for meshes.
size[0] = 1.f;
size[1] = 1.f;
size[2] = 1.f;
break;
case mjGEOM_HFIELD:
mjrf_setRenderableMesh(renderable, GetHeightField(model_objects, geom.dataid), 0, 0);
mjrf_setRenderableMesh(renderable, model_objs->GetHeightField(geom.dataid), 0, 0);
// Ignore size for meshes.
size[0] = 1.f;
size[1] = 1.f;
size[2] = 1.f;
break;
case mjGEOM_PLANE: {
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
const bool is_infinite = !(size[0] > 0 && size[1] > 0);
if (is_infinite) {
@@ -113,40 +93,40 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom,
break;
}
case mjGEOM_SPHERE:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_ELLIPSOID:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_BOX:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_CAPSULE:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_CYLINDER:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_ARROW:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_ARROW1:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_ARROW2:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_LINE:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_LINEBOX:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_TRIANGLE:
mjrf_setRenderableGeomMesh(renderable, (mjtGeom)geom.type, nstack, nslice, nquad);
mjrf_setRenderableGeomMesh(renderable, geom_type, nstack, nslice, nquad);
break;
case mjGEOM_FLEX:
mjrf_setRenderableMesh(renderable, GetSkinFlexMesh(model_objects, geom.objid), 0, 0);
mjrf_setRenderableMesh(renderable, model_objs->GetFlexSkinMesh(geom.objid), 0, 0);
// Flexes are defined in global space.
std::memset(position, 0, sizeof(position));
std::memset(rotation, 0, sizeof(rotation));
@@ -158,7 +138,7 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom,
size[2] = 1.f;
break;
case mjGEOM_SKIN:
mjrf_setRenderableMesh(renderable, GetSkinFlexMesh(model_objects, geom.objid), 0, 0);
mjrf_setRenderableMesh(renderable, model_objs->GetFlexSkinMesh(geom.objid), 0, 0);
// Skins are defined in global space.
std::memset(position, 0, sizeof(position));
std::memset(rotation, 0, sizeof(rotation));
@@ -182,11 +162,10 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom,
}
static void UpdateGeomMaterial(mjrRenderable* renderable, const mjvGeom& geom,
const mjvScene* scene, ModelObjects* model_objs,
const float headpos[3]) {
ModelObjects* model_objs, const float headpos[3],
const mjtByte render_flags[mjNRNDFLAG]) {
const mjModel* model = model_objs->GetModel();
const bool use_segid_color = scene->flags[mjRND_IDCOLOR];
mjrMaterial material;
mjr_defaultMaterial(&material);
@@ -213,22 +192,21 @@ static void UpdateGeomMaterial(mjrRenderable* renderable, const mjvGeom& geom,
mjrf_setRenderableCastShadows(renderable, false);
mjrf_setRenderableReceiveShadows(renderable, false);
} else {
mjrf_setRenderableWireframe(renderable, scene->flags[mjRND_WIREFRAME]);
mjrf_setRenderableWireframe(renderable, render_flags[mjRND_WIREFRAME]);
}
if (geom.matid >= 0) {
material.color_texture = model_objs->GetTexture(geom.matid, mjTEXROLE_RGB);
material.normal_texture =
model_objs->GetTexture(geom.matid, mjTEXROLE_NORMAL);
material.emissive_texture =
model_objs->GetTexture(geom.matid, mjTEXROLE_EMISSIVE);
material.orm_texture = model_objs->GetTexture(geom.matid, mjTEXROLE_ORM);
material.metallic_texture =
model_objs->GetTexture(geom.matid, mjTEXROLE_METALLIC);
material.roughness_texture =
model_objs->GetTexture(geom.matid, mjTEXROLE_ROUGHNESS);
material.occlusion_texture =
model_objs->GetTexture(geom.matid, mjTEXROLE_OCCLUSION);
if (geom.matid >= 0 && geom.matid < model->nmat) {
auto get_texture = [&](int role) -> const mjrTexture* {
const int tex_id = model->mat_texid[geom.matid * mjNTEXROLE + role];
return tex_id >= 0 ? model_objs->GetTexture(tex_id) : nullptr;
};
material.color_texture = get_texture(mjTEXROLE_RGB);
material.normal_texture = get_texture(mjTEXROLE_NORMAL);
material.emissive_texture = get_texture(mjTEXROLE_EMISSIVE);
material.orm_texture = get_texture(mjTEXROLE_ORM);
material.metallic_texture = get_texture(mjTEXROLE_METALLIC);
material.roughness_texture = get_texture(mjTEXROLE_ROUGHNESS);
material.occlusion_texture = get_texture(mjTEXROLE_OCCLUSION);
}
material.reflectance = geom.reflectance;
@@ -242,6 +220,7 @@ static void UpdateGeomMaterial(mjrRenderable* renderable, const mjvGeom& geom,
if (geom.segid >= 0) {
uint32_t segmentation_color = geom.segid + 1;
const bool use_segid_color = render_flags[mjRND_IDCOLOR];
if (!use_segid_color) {
constexpr double phi1 = 1.61803398874989484820; // Cached Phi(1).
constexpr double coef1 = 1.0 / phi1;
@@ -337,13 +316,13 @@ static void UpdateGeomMaterial(mjrRenderable* renderable, const mjvGeom& geom,
}
UniquePtr<mjrRenderable> CreateGeomRenderable(
const mjvGeom& geom, const mjvScene* scene, mjrfContext* ctx,
ModelObjects* model_objs, const float headpos[3]) {
const mjvGeom& geom, mjrfContext* ctx, ModelObjects* model_objs,
const float headpos[3], const mjtByte render_flags[mjNRNDFLAG]) {
mjrRenderableParams params;
mjr_defaultRenderableParams(&params);
auto renderable = CreateRenderable(ctx, params);
PrepareGeomMeshes(renderable.get(), geom, scene, model_objs);
UpdateGeomMaterial(renderable.get(), geom, scene, model_objs, headpos);
PrepareGeomMeshes(renderable.get(), geom, model_objs);
UpdateGeomMaterial(renderable.get(), geom, model_objs, headpos, render_flags);
return renderable;
}
} // namespace mujoco