diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index d783cefa..973425d1 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -45,6 +45,7 @@ #include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/render_target_util.h" #include "experimental/filament/filament/scene_view.h" +#include "experimental/filament/filament/texture_util.h" #include "experimental/filament/render_context_filament.h" namespace mujoco { @@ -62,16 +63,18 @@ FilamentContext::FilamentContext(const mjrFilamentConfig* config) engine_ = engine_builder.build(); renderer_ = engine_->createRenderer(); - #ifdef __EMSCRIPTEN__ - window_swap_chain_ = engine_->createSwapChain(nullptr); - #else +#ifdef __EMSCRIPTEN__ + window_swap_chain_ = engine_->createSwapChain(nullptr); +#else if (config_.native_window) { window_swap_chain_ = engine_->createSwapChain(config_.native_window); } else { - window_swap_chain_ = engine_->createSwapChain(config_.width, config_.height); + window_swap_chain_ = + engine_->createSwapChain(config_.width, config_.height); } - #endif - offscreen_swap_chain_ = engine_->createSwapChain(config_.width, config_.height); +#endif + offscreen_swap_chain_ = + engine_->createSwapChain(config_.width, config_.height); object_manager_ = std::make_unique(engine_); } @@ -183,11 +186,13 @@ void FilamentContext::SetFrameBuffer(int framebuffer) { void FilamentContext::PrepareRenderTargets(int width, int height) { color_target_ = std::make_unique( - engine_, kRenderTargetColor, kRenderTargetDepth); + engine_, RenderTargetTextureType::kColor, + RenderTargetTextureType::kDepth); color_target_->Prepare(width, height); depth_target_ = std::make_unique( - engine_, kRenderTargetDepthColor, kRenderTargetDepth); + engine_, RenderTargetTextureType::kDepthColor, + RenderTargetTextureType::kDepth); depth_target_->Prepare(width, height); } @@ -310,8 +315,6 @@ double FilamentContext::GetFrameRate() const { return 1.0e9 / static_cast(ns); } -void FilamentContext::UpdateGui() { - DrawGui(scene_view_.get()); -} +void FilamentContext::UpdateGui() { DrawGui(scene_view_.get()); } } // namespace mujoco diff --git a/src/experimental/filament/filament/model_util.cc b/src/experimental/filament/filament/model_util.cc index 78fca85c..62e72d73 100644 --- a/src/experimental/filament/filament/model_util.cc +++ b/src/experimental/filament/filament/model_util.cc @@ -486,23 +486,4 @@ filament::IndexBuffer* CreateIndexBuffer(filament::Engine* engine, FillSequence); } } - -filament::Texture* CreateTexture(filament::Engine* engine, const mjModel* model, - int id, TextureType texture_type) { - if (id < 0 || id >= model->ntex) { - mju_error("Invalid texture index %d", id); - } - - const int width = model->tex_width[id]; - const int height = model->tex_height[id]; - const bool is_srgb = model->tex_colorspace[id] == mjCOLORSPACE_SRGB; - const int num_channels = model->tex_nchannel[id]; - const mjtByte* data = model->tex_data + model->tex_adr[id]; - filament::Texture* texture = - texture_type == TextureType::kNormal2d - ? Create2dTexture(engine, width, height, num_channels, data, is_srgb) - : CreateCubeTexture(engine, width, height, num_channels, data, - is_srgb); - return texture; -} } // namespace mujoco diff --git a/src/experimental/filament/filament/model_util.h b/src/experimental/filament/filament/model_util.h index 57171674..edf14fed 100644 --- a/src/experimental/filament/filament/model_util.h +++ b/src/experimental/filament/filament/model_util.h @@ -37,12 +37,6 @@ enum class MeshType { kHeightField, }; -// The types of textures stored in the mjModel. -enum class TextureType { - kNormal2d, - kCube, -}; - // Generates a filament VertexBuffer for a given mesh in the mjModel. filament::VertexBuffer* CreateVertexBuffer(filament::Engine* engine, const mjModel* model, int id, @@ -54,10 +48,6 @@ filament::IndexBuffer* CreateIndexBuffer(filament::Engine* engine, const mjModel* model, int id, MeshType mesh_type); -// Generates a filament Texture for a given 2D texture in the mjModel. -filament::Texture* CreateTexture(filament::Engine* engine, const mjModel* model, - int id, TextureType texture_type); - // Reads a value with the given name from the mjModel's data sections. The // default_value is returned if the named element is not found. template diff --git a/src/experimental/filament/filament/render_target_util.cc b/src/experimental/filament/filament/render_target_util.cc index 52cbc25c..306bb258 100644 --- a/src/experimental/filament/filament/render_target_util.cc +++ b/src/experimental/filament/filament/render_target_util.cc @@ -21,39 +21,7 @@ namespace mujoco { -static filament::Texture* CreateRenderTargetTexture( - filament::Engine* engine, int width, int height, - RenderTargetTextureType type) { - filament::Texture::Builder builder; - builder.width(width); - builder.height(height); - switch (type) { - case kRenderTargetColor: - builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | - filament::Texture::Usage::BLIT_SRC); - builder.format(filament::Texture::InternalFormat::RGB8); - break; - case kRenderTargetDepth: - builder.usage(filament::Texture::Usage::DEPTH_ATTACHMENT | - filament::Texture::Usage::SAMPLEABLE); - builder.format(filament::Texture::InternalFormat::DEPTH32F); - break; - case kRenderTargetDepthColor: - builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | - filament::Texture::Usage::BLIT_SRC); - builder.format(filament::Texture::InternalFormat::R32F); - break; - case kRenderTargetReflectionColor: - builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | - filament::Texture::Usage::BLIT_SRC | - filament::Texture::Usage::SAMPLEABLE); - builder.format(filament::Texture::InternalFormat::RGBA8); - break; - default: - mju_error("Unknown type: %d", static_cast(type)); - } - return builder.build(*engine); -} + RenderTargetAndTextures::RenderTargetAndTextures(filament::Engine* engine, RenderTargetTextureType color, diff --git a/src/experimental/filament/filament/render_target_util.h b/src/experimental/filament/filament/render_target_util.h index e8dfb939..c7651741 100644 --- a/src/experimental/filament/filament/render_target_util.h +++ b/src/experimental/filament/filament/render_target_util.h @@ -17,19 +17,10 @@ #include #include +#include "experimental/filament/filament/texture_util.h" namespace mujoco { -// The different types of textures we can create for a render target. -enum RenderTargetTextureType { - kRenderTargetNone, - kRenderTargetColor, - kRenderTargetDepth, - kRenderTargetDepthColor, - kRenderTargetReflectionColor, - kNumRenderTargetTextureTypes, -}; - // Manages a filament RenderTarget and the textures which are bound to it. class RenderTargetAndTextures { public: @@ -63,8 +54,8 @@ class RenderTargetAndTextures { filament::Texture* color_texture_ = nullptr; filament::Texture* depth_texture_ = nullptr; filament::RenderTarget* render_target_ = nullptr; - RenderTargetTextureType color_type_ = kRenderTargetNone; - RenderTargetTextureType depth_type_ = kRenderTargetNone; + RenderTargetTextureType color_type_; + RenderTargetTextureType depth_type_; int width_ = 0; int height_ = 0; }; diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index aba4e0b8..9b64243e 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -50,6 +50,7 @@ #include "experimental/filament/filament/model_util.h" #include "experimental/filament/filament/object_manager.h" #include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/texture_util.h" namespace mujoco { @@ -516,7 +517,8 @@ void SceneView::AddReflectiveDrawable(Drawable* drawable) { filament::Engine* engine = object_mgr_->GetEngine(); while (reflect_targets_.size() < reflectives_.size()) { reflect_targets_.push_back(std::make_unique( - engine, kRenderTargetReflectionColor, kRenderTargetDepth)); + engine, RenderTargetTextureType::kReflectionColor, + RenderTargetTextureType::kDepth)); } // Prepare a render target for the reflective drawable. diff --git a/src/experimental/filament/filament/texture_util.cc b/src/experimental/filament/filament/texture_util.cc index 1cf5567c..c003f403 100644 --- a/src/experimental/filament/filament/texture_util.cc +++ b/src/experimental/filament/filament/texture_util.cc @@ -26,7 +26,6 @@ #include #include - namespace mujoco { static filament::Texture::Format GetTextureFormat(int num_channels) { @@ -168,6 +167,40 @@ filament::Texture* CreateCubeTexture(filament::Engine* engine, int width, return texture; } +filament::Texture* CreateRenderTargetTexture( + filament::Engine* engine, int width, int height, + RenderTargetTextureType type) { + filament::Texture::Builder builder; + builder.width(width); + builder.height(height); + switch (type) { + case RenderTargetTextureType::kColor: + builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | + filament::Texture::Usage::BLIT_SRC); + builder.format(filament::Texture::InternalFormat::RGB8); + break; + case RenderTargetTextureType::kDepth: + builder.usage(filament::Texture::Usage::DEPTH_ATTACHMENT | + filament::Texture::Usage::SAMPLEABLE); + builder.format(filament::Texture::InternalFormat::DEPTH32F); + break; + case RenderTargetTextureType::kDepthColor: + builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | + filament::Texture::Usage::BLIT_SRC); + builder.format(filament::Texture::InternalFormat::R32F); + break; + case RenderTargetTextureType::kReflectionColor: + builder.usage(filament::Texture::Usage::COLOR_ATTACHMENT | + filament::Texture::Usage::BLIT_SRC | + filament::Texture::Usage::SAMPLEABLE); + builder.format(filament::Texture::InternalFormat::RGBA8); + break; + default: + mju_error("Unknown type: %d", static_cast(type)); + } + return builder.build(*engine); +} + filament::Texture* CreateKtxTexture( filament::Engine* engine, const uint8_t* data, int size, filament::math::float3* spherical_harmonics_out) { @@ -178,4 +211,23 @@ filament::Texture* CreateKtxTexture( const bool is_srgb = false; return ktxreader::Ktx1Reader::createTexture(engine, bundle, is_srgb); } + +filament::Texture* CreateTexture(filament::Engine* engine, const mjModel* model, + int id, TextureType texture_type) { + if (id < 0 || id >= model->ntex) { + mju_error("Invalid texture index %d", id); + } + + const int width = model->tex_width[id]; + const int height = model->tex_height[id]; + const bool is_srgb = model->tex_colorspace[id] == mjCOLORSPACE_SRGB; + const int num_channels = model->tex_nchannel[id]; + const mjtByte* data = model->tex_data + model->tex_adr[id]; + filament::Texture* texture = + texture_type == TextureType::kNormal2d + ? Create2dTexture(engine, width, height, num_channels, data, is_srgb) + : CreateCubeTexture(engine, width, height, num_channels, data, + is_srgb); + return texture; +} } // namespace mujoco diff --git a/src/experimental/filament/filament/texture_util.h b/src/experimental/filament/filament/texture_util.h index 3136b81c..dd267af8 100644 --- a/src/experimental/filament/filament/texture_util.h +++ b/src/experimental/filament/filament/texture_util.h @@ -20,10 +20,26 @@ #include #include #include +#include // Functions for creating filament textures. namespace mujoco { +// The types of textures we can create. +enum class TextureType { + kNormal2d, + kCube, + kKtx, +}; + +// The different types of textures we can create for a render target. +enum class RenderTargetTextureType { + kColor, + kDepth, + kDepthColor, + kReflectionColor, +}; + // Creates a filament Texture for the given 2D texture. filament::Texture* Create2dTexture(filament::Engine* engine, int width, int height, int num_channels, @@ -39,6 +55,15 @@ filament::Texture* CreateKtxTexture( filament::Engine* engine, const uint8_t* data, int size, filament::math::float3* spherical_harmonics_out); +// Creates a filament Texture for the given texture in the mjModel. +filament::Texture* CreateTexture(filament::Engine* engine, const mjModel* model, + int id, TextureType texture_type); + +// Creates a filament Texture for the given render target. +filament::Texture* CreateRenderTargetTexture(filament::Engine* engine, + int width, int height, + RenderTargetTextureType type); + } // namespace mujoco #endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_TEXTURE_UTIL_H_