From aa25075ea4fcf64d7fbfa5af66c61226229df998 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 26 Nov 2025 05:32:09 -0800 Subject: [PATCH] Implement triangle geoms. PiperOrigin-RevId: 837079122 Change-Id: If7aa0904c6f3e7c62477b75b17d67259fe2bdabb --- .../filament/filament/builtins.cc | 40 +++++++++++++++++++ src/experimental/filament/filament/builtins.h | 1 + .../filament/filament/drawable.cc | 2 + .../filament/filament/object_manager.cc | 1 + .../filament/filament/object_manager.h | 1 + 5 files changed, 45 insertions(+) diff --git a/src/experimental/filament/filament/builtins.cc b/src/experimental/filament/filament/builtins.cc index e7beacc8..8d86b7f7 100644 --- a/src/experimental/filament/filament/builtins.cc +++ b/src/experimental/filament/filament/builtins.cc @@ -145,6 +145,42 @@ class PlaneBuilder { float4 orientation_; }; +class TriangleBuilder { + public: + using VertexType = VertexNoUv; + using IndexType = uint16_t; + static constexpr filament::RenderableManager::PrimitiveType kPrimitiveType = + filament::RenderableManager::PrimitiveType::TRIANGLES; + + TriangleBuilder() + : orientation_(CalculateOrientation({0, 0, 1})) {} + + std::size_t NumVertices() const { + return 3; + } + + std::size_t NumIndices() const { + return 3; + } + + void GenerateVertices(VertexType* ptr, size_t num) const { + ptr[0] = VertexType({0, 0, 0}, orientation_); + ptr[1] = VertexType({1, 0, 0}, orientation_); + ptr[2] = VertexType({0, 1, 0}, orientation_); + } + + void GenerateIndices(IndexType* ptr, size_t num) const { + ptr[0] = 0; + ptr[1] = 1; + ptr[2] = 2; + } + + filament::Box GetBounds() const { return {{-1, -1, -0.001}, {1, 1, 0.001}}; } + + private: + float4 orientation_; +}; + class LineBoxBuilder { public: using VertexType = VertexNoUv; @@ -745,6 +781,10 @@ FilamentBuffers CreatePlane(filament::Engine* engine, const mjModel* model) { return CreateFromBuilder(engine, PlaneBuilder(num_quads)); } +FilamentBuffers CreateTriangle(filament::Engine* engine, const mjModel* model) { + return CreateFromBuilder(engine, TriangleBuilder()); +} + FilamentBuffers CreateBox(filament::Engine* engine, const mjModel* model) { const int num_quads = model->vis.quality.numquads; return CreateFromBuilder(engine, BoxBuilder(num_quads)); diff --git a/src/experimental/filament/filament/builtins.h b/src/experimental/filament/filament/builtins.h index e6a8a9ed..e2ad0b4d 100644 --- a/src/experimental/filament/filament/builtins.h +++ b/src/experimental/filament/filament/builtins.h @@ -25,6 +25,7 @@ namespace mujoco { FilamentBuffers CreateLine(filament::Engine* engine, const mjModel* model); FilamentBuffers CreateBox(filament::Engine* engine, const mjModel* model); FilamentBuffers CreateLineBox(filament::Engine* engine, const mjModel* model); +FilamentBuffers CreateTriangle(filament::Engine* engine, const mjModel* model); FilamentBuffers CreatePlane(filament::Engine* engine, const mjModel* model); FilamentBuffers CreateSphere(filament::Engine* engine, const mjModel* model); FilamentBuffers CreateTube(filament::Engine* engine, const mjModel* model); diff --git a/src/experimental/filament/filament/drawable.cc b/src/experimental/filament/filament/drawable.cc index ed1fea28..af2e4fd0 100644 --- a/src/experimental/filament/filament/drawable.cc +++ b/src/experimental/filament/filament/drawable.cc @@ -111,6 +111,8 @@ Drawable::Drawable(ObjectManager* object_mgr, const mjvGeom& geom) AddShape(ObjectManager::kLine); } else if (geom.type == mjGEOM_LINEBOX) { AddShape(ObjectManager::kLineBox); + } else if (geom.type == mjGEOM_TRIANGLE) { + AddShape(ObjectManager::kTriangle); } else if (geom.type == mjGEOM_FLEX || geom.type == mjGEOM_SKIN) { // Flex and skin geometries are dynamically updated every frame. } else { diff --git a/src/experimental/filament/filament/object_manager.cc b/src/experimental/filament/filament/object_manager.cc index 4af3625c..5e204b78 100644 --- a/src/experimental/filament/filament/object_manager.cc +++ b/src/experimental/filament/filament/object_manager.cc @@ -77,6 +77,7 @@ ObjectManager::ObjectManager(const mjModel* model, filament::Engine* engine, shapes_[kTube] = CreateTube(engine_, model_); shapes_[kPlane] = CreatePlane(engine_, model_); shapes_[kSphere] = CreateSphere(engine_, model_); + shapes_[kTriangle] = CreateTriangle(engine_, model_); auto LoadMaterial = [this](const char* filename) { Asset asset(filename, config_); diff --git a/src/experimental/filament/filament/object_manager.h b/src/experimental/filament/filament/object_manager.h index 40c3848a..c0e1282f 100644 --- a/src/experimental/filament/filament/object_manager.h +++ b/src/experimental/filament/filament/object_manager.h @@ -60,6 +60,7 @@ class ObjectManager { kLine, kLineBox, kPlane, + kTriangle, kBox, kSphere, kCone,