Make Renderer own the scenes.
PiperOrigin-RevId: 936547976 Change-Id: Iec87426a9ae255cdbd3efadc7b602d4183679c81
This commit is contained in:
committed by
Copybara-Service
parent
2800a682e4
commit
7f66f42568
@@ -40,28 +40,25 @@ using filament::math::float4;
|
|||||||
using filament::math::mat3;
|
using filament::math::mat3;
|
||||||
using filament::math::mat4;
|
using filament::math::mat4;
|
||||||
|
|
||||||
SceneBridge::SceneBridge(mjrfContext* ctx, const mjModel* model)
|
SceneBridge::SceneBridge(mjrfContext* ctx, mjrfScene* scene, const mjModel* model)
|
||||||
: ctx_(ctx) {
|
: ctx_(ctx), scene_(scene) {
|
||||||
mjrfSceneParams params;
|
|
||||||
mjrf_defaultSceneParams(¶ms);
|
|
||||||
scene_ = CreateScene(ctx_, params);
|
|
||||||
model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
|
model_objects_ = std::make_unique<ModelObjects>(model, ctx_);
|
||||||
scene_objects_ = std::make_unique<SceneObjects>(ctx_);
|
scene_objects_ = std::make_unique<SceneObjects>(ctx_);
|
||||||
|
|
||||||
mjrf_configureSceneFromModel(scene_.get(), model);
|
mjrf_configureSceneFromModel(scene_, model);
|
||||||
|
|
||||||
auto clear_color = ReadElement(model, "filament.clearColor",
|
auto clear_color = ReadElement(model, "filament.clearColor",
|
||||||
filament::math::float4(0, 0, 0, 1));
|
filament::math::float4(0, 0, 0, 1));
|
||||||
mjrf_setClearColor(ctx_, &clear_color[0]);
|
mjrf_setClearColor(ctx_, &clear_color[0]);
|
||||||
|
|
||||||
light_manager_ =
|
light_manager_ =
|
||||||
std::make_unique<LightManager>(ctx_, scene_.get(), model_objects_.get());
|
std::make_unique<LightManager>(ctx_, scene_, model_objects_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
SceneBridge::~SceneBridge() {
|
SceneBridge::~SceneBridge() {
|
||||||
light_manager_.reset();
|
light_manager_.reset();
|
||||||
for (auto& iter : renderables_) {
|
for (auto& iter : renderables_) {
|
||||||
mjrf_removeRenderableFromScene(scene_.get(), iter.get());
|
mjrf_removeRenderableFromScene(scene_, iter.get());
|
||||||
}
|
}
|
||||||
renderables_.clear();
|
renderables_.clear();
|
||||||
}
|
}
|
||||||
@@ -115,7 +112,7 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
|
|
||||||
// Remove all drawables from previous render and prepare new ones.
|
// Remove all drawables from previous render and prepare new ones.
|
||||||
for (auto& iter : renderables_) {
|
for (auto& iter : renderables_) {
|
||||||
mjrf_removeRenderableFromScene(scene_.get(), iter.get());
|
mjrf_removeRenderableFromScene(scene_, iter.get());
|
||||||
}
|
}
|
||||||
renderables_.clear();
|
renderables_.clear();
|
||||||
for (int i = 0; i < scene->ngeom; ++i) {
|
for (int i = 0; i < scene->ngeom; ++i) {
|
||||||
@@ -154,7 +151,7 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
mjrf_setRenderableMaterial(vertex.get(), &material);
|
mjrf_setRenderableMaterial(vertex.get(), &material);
|
||||||
mjrf_setRenderableSize(vertex.get(), size);
|
mjrf_setRenderableSize(vertex.get(), size);
|
||||||
mjrf_setRenderableTransform(vertex.get(), scene->flexvert + 3*v, rot);
|
mjrf_setRenderableTransform(vertex.get(), scene->flexvert + 3*v, rot);
|
||||||
mjrf_addRenderableToScene(scene_.get(), vertex.get());
|
mjrf_addRenderableToScene(scene_, vertex.get());
|
||||||
renderables_.push_back(std::move(vertex));
|
renderables_.push_back(std::move(vertex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,7 +196,7 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
mjrf_setRenderableMaterial(vertex.get(), &material);
|
mjrf_setRenderableMaterial(vertex.get(), &material);
|
||||||
mjrf_setRenderableSize(vertex.get(), size);
|
mjrf_setRenderableSize(vertex.get(), size);
|
||||||
mjrf_setRenderableTransform(vertex.get(), pos, rot);
|
mjrf_setRenderableTransform(vertex.get(), pos, rot);
|
||||||
mjrf_addRenderableToScene(scene_.get(), vertex.get());
|
mjrf_addRenderableToScene(scene_, vertex.get());
|
||||||
renderables_.push_back(std::move(vertex));
|
renderables_.push_back(std::move(vertex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -215,7 +212,7 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
UniquePtr<mjrfRenderable> renderable = CreateGeomRenderable(
|
UniquePtr<mjrfRenderable> renderable = CreateGeomRenderable(
|
||||||
*geom, ctx_, model_objects_.get(), scene_objects_.get());
|
*geom, ctx_, model_objects_.get(), scene_objects_.get());
|
||||||
|
|
||||||
mjrf_addRenderableToScene(scene_.get(), renderable.get());
|
mjrf_addRenderableToScene(scene_, renderable.get());
|
||||||
renderables_.push_back(std::move(renderable));
|
renderables_.push_back(std::move(renderable));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,8 +266,6 @@ void SceneBridge::SetDrawTextFunction(DrawTextAtFn fn) {
|
|||||||
draw_text_callback_ = std::move(fn);
|
draw_text_callback_ = std::move(fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
mjrfScene* SceneBridge::GetScene() const { return scene_.get(); }
|
|
||||||
|
|
||||||
mjrCamera SceneBridge::GetCamera() const { return camera_; }
|
mjrCamera SceneBridge::GetCamera() const { return camera_; }
|
||||||
|
|
||||||
} // namespace mujoco
|
} // namespace mujoco
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace mujoco {
|
|||||||
// Manages all mjModel data and updates a SceneView using an mjvScene.
|
// Manages all mjModel data and updates a SceneView using an mjvScene.
|
||||||
class SceneBridge {
|
class SceneBridge {
|
||||||
public:
|
public:
|
||||||
SceneBridge(mjrfContext* ctx, const mjModel* model);
|
SceneBridge(mjrfContext* ctx, mjrfScene* scene, const mjModel* model);
|
||||||
~SceneBridge();
|
~SceneBridge();
|
||||||
|
|
||||||
// Updates the Entities in the filament Scene to match the current mjvScene
|
// Updates the Entities in the filament Scene to match the current mjvScene
|
||||||
@@ -50,8 +50,7 @@ class SceneBridge {
|
|||||||
using DrawTextAtFn = std::function<void(const char*, float, float, float)>;
|
using DrawTextAtFn = std::function<void(const char*, float, float, float)>;
|
||||||
void SetDrawTextFunction(DrawTextAtFn fn);
|
void SetDrawTextFunction(DrawTextAtFn fn);
|
||||||
|
|
||||||
// Returns the managed scene.
|
// Returns the camera used for rendering the scene.
|
||||||
mjrfScene* GetScene() const;
|
|
||||||
mjrCamera GetCamera() const;
|
mjrCamera GetCamera() const;
|
||||||
|
|
||||||
SceneBridge(const SceneBridge&) = delete;
|
SceneBridge(const SceneBridge&) = delete;
|
||||||
@@ -64,12 +63,12 @@ class SceneBridge {
|
|||||||
const filament::math::float3& pos) const;
|
const filament::math::float3& pos) const;
|
||||||
|
|
||||||
mjrfContext* ctx_ = nullptr;
|
mjrfContext* ctx_ = nullptr;
|
||||||
|
mjrfScene* scene_ = nullptr;
|
||||||
std::unique_ptr<ModelObjects> model_objects_;
|
std::unique_ptr<ModelObjects> model_objects_;
|
||||||
std::unique_ptr<SceneObjects> scene_objects_;
|
std::unique_ptr<SceneObjects> scene_objects_;
|
||||||
std::unique_ptr<LightManager> light_manager_;
|
std::unique_ptr<LightManager> light_manager_;
|
||||||
mjrCamera camera_;
|
mjrCamera camera_;
|
||||||
DrawTextAtFn draw_text_callback_;
|
DrawTextAtFn draw_text_callback_;
|
||||||
UniquePtr<mjrfScene> scene_{nullptr, nullptr};
|
|
||||||
std::vector<UniquePtr<mjrfRenderable>> renderables_;
|
std::vector<UniquePtr<mjrfRenderable>> renderables_;
|
||||||
filament::math::mat4 clip_from_world_;
|
filament::math::mat4 clip_from_world_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -59,7 +59,8 @@ class CompatContext {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
mjrDrawMode draw_mode_ = mjDRAW_MODE_DEFAULT;
|
mjrDrawMode draw_mode_ = mjDRAW_MODE_DEFAULT;
|
||||||
UniquePtr<mjrfContext> context_;
|
UniquePtr<mjrfContext> context_{nullptr, nullptr};
|
||||||
|
UniquePtr<mjrfScene> scene_{nullptr, nullptr};
|
||||||
std::unique_ptr<SceneBridge> scene_bridge_;
|
std::unique_ptr<SceneBridge> scene_bridge_;
|
||||||
mjtFramebuffer framebuffer_ = mjFB_WINDOW;
|
mjtFramebuffer framebuffer_ = mjFB_WINDOW;
|
||||||
UniquePtr<mjrfRenderTarget> color_target_{nullptr, nullptr};
|
UniquePtr<mjrfRenderTarget> color_target_{nullptr, nullptr};
|
||||||
@@ -67,9 +68,11 @@ class CompatContext {
|
|||||||
};
|
};
|
||||||
|
|
||||||
CompatContext::CompatContext(const mjrfContextConfig* config,
|
CompatContext::CompatContext(const mjrfContextConfig* config,
|
||||||
const mjModel* model)
|
const mjModel* model) {
|
||||||
: context_(CreateContext(*config)) {
|
context_ = CreateContext(*config);
|
||||||
scene_bridge_ = std::make_unique<SceneBridge>(context_.get(), model);
|
scene_ = CreateScene(context_.get(), {});
|
||||||
|
scene_bridge_ =
|
||||||
|
std::make_unique<SceneBridge>(context_.get(), scene_.get(), model);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompatContext::Render(const mjrRect& viewport, const mjvScene* scene) {
|
void CompatContext::Render(const mjrRect& viewport, const mjvScene* scene) {
|
||||||
@@ -92,7 +95,7 @@ void CompatContext::Render(const mjrRect& viewport, const mjvScene* scene) {
|
|||||||
if (framebuffer_ == mjFB_WINDOW) {
|
if (framebuffer_ == mjFB_WINDOW) {
|
||||||
mjrfRenderRequest req;
|
mjrfRenderRequest req;
|
||||||
mjrf_defaultRenderRequest(&req);
|
mjrf_defaultRenderRequest(&req);
|
||||||
req.scene = scene_bridge_->GetScene();
|
req.scene = scene_.get();
|
||||||
req.draw_mode = draw_mode_;
|
req.draw_mode = draw_mode_;
|
||||||
req.camera = scene_bridge_->GetCamera();
|
req.camera = scene_bridge_->GetCamera();
|
||||||
req.viewport = viewport;
|
req.viewport = viewport;
|
||||||
@@ -121,7 +124,7 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
|
|
||||||
mjrfRenderRequest req;
|
mjrfRenderRequest req;
|
||||||
mjrf_defaultRenderRequest(&req);
|
mjrf_defaultRenderRequest(&req);
|
||||||
req.scene = scene_bridge_->GetScene();
|
req.scene = scene_.get();
|
||||||
req.draw_mode = draw_mode_;
|
req.draw_mode = draw_mode_;
|
||||||
req.camera = scene_bridge_->GetCamera();
|
req.camera = scene_bridge_->GetCamera();
|
||||||
req.viewport = viewport;
|
req.viewport = viewport;
|
||||||
@@ -149,7 +152,7 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
|
|
||||||
mjrfRenderRequest req;
|
mjrfRenderRequest req;
|
||||||
mjrf_defaultRenderRequest(&req);
|
mjrf_defaultRenderRequest(&req);
|
||||||
req.scene = scene_bridge_->GetScene();
|
req.scene = scene_.get();
|
||||||
req.draw_mode = mjDRAW_MODE_DEPTH;
|
req.draw_mode = mjDRAW_MODE_DEPTH;
|
||||||
req.camera = scene_bridge_->GetCamera();
|
req.camera = scene_bridge_->GetCamera();
|
||||||
req.viewport = viewport;
|
req.viewport = viewport;
|
||||||
|
|||||||
@@ -69,8 +69,8 @@ Renderer::Renderer(void* native_window, GraphicsMode gfx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_update_gui_callback = [this]() {
|
g_update_gui_callback = [this]() {
|
||||||
if (scene_bridge_) {
|
if (main_scene_) {
|
||||||
mjrf_DEBUG_drawImguiEditor(scene_bridge_->GetScene());
|
mjrf_DEBUG_drawImguiEditor(main_scene_.get());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -102,9 +102,12 @@ void Renderer::Init(const mjModel* model) {
|
|||||||
? mjGRAPHICS_API_OPENGL
|
? mjGRAPHICS_API_OPENGL
|
||||||
: mjGRAPHICS_API_VULKAN;
|
: mjGRAPHICS_API_VULKAN;
|
||||||
filament_context_ = CreateContext(cfg);
|
filament_context_ = CreateContext(cfg);
|
||||||
scene_bridge_ =
|
main_scene_ = CreateScene(filament_context_.get(), {});
|
||||||
std::make_unique<SceneBridge>(filament_context_.get(), model);
|
ux_scene_ = CreateScene(filament_context_.get(), {});
|
||||||
imgui_bridge_ = std::make_unique<ImguiBridge>(filament_context_.get());
|
scene_bridge_ = std::make_unique<SceneBridge>(filament_context_.get(),
|
||||||
|
main_scene_.get(), model);
|
||||||
|
imgui_bridge_ = std::make_unique<ImguiBridge>(filament_context_.get(),
|
||||||
|
ux_scene_.get());
|
||||||
scene_bridge_->SetDrawTextFunction(DrawTextAt);
|
scene_bridge_->SetDrawTextFunction(DrawTextAt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +125,8 @@ void Renderer::Deinit() {
|
|||||||
} else {
|
} else {
|
||||||
scene_bridge_.reset();
|
scene_bridge_.reset();
|
||||||
imgui_bridge_.reset();
|
imgui_bridge_.reset();
|
||||||
|
ux_scene_.reset();
|
||||||
|
main_scene_.reset();
|
||||||
filament_context_.reset();
|
filament_context_.reset();
|
||||||
}
|
}
|
||||||
initialized_ = false;
|
initialized_ = false;
|
||||||
@@ -242,7 +247,7 @@ void Renderer::DoRender(int width, int height) {
|
|||||||
mjrfRenderRequest reqs[2];
|
mjrfRenderRequest reqs[2];
|
||||||
|
|
||||||
mjrf_defaultRenderRequest(&reqs[0]);
|
mjrf_defaultRenderRequest(&reqs[0]);
|
||||||
reqs[0].scene = scene_bridge_->GetScene();
|
reqs[0].scene = main_scene_.get();
|
||||||
reqs[0].draw_mode = draw_mode;
|
reqs[0].draw_mode = draw_mode;
|
||||||
reqs[0].camera = scene_bridge_->GetCamera();
|
reqs[0].camera = scene_bridge_->GetCamera();
|
||||||
reqs[0].viewport = viewport;
|
reqs[0].viewport = viewport;
|
||||||
@@ -250,7 +255,7 @@ void Renderer::DoRender(int width, int height) {
|
|||||||
reqs[0].enable_reflections = scene_.flags[mjRND_REFLECTION];
|
reqs[0].enable_reflections = scene_.flags[mjRND_REFLECTION];
|
||||||
|
|
||||||
mjrf_defaultRenderRequest(&reqs[1]);
|
mjrf_defaultRenderRequest(&reqs[1]);
|
||||||
reqs[1].scene = imgui_bridge_->GetScene();
|
reqs[1].scene = ux_scene_.get();
|
||||||
reqs[1].draw_mode = mjDRAW_MODE_DEFAULT;
|
reqs[1].draw_mode = mjDRAW_MODE_DEFAULT;
|
||||||
reqs[1].camera = imgui_bridge_->GetCamera(viewport.width, viewport.height);
|
reqs[1].camera = imgui_bridge_->GetCamera(viewport.width, viewport.height);
|
||||||
reqs[1].viewport = viewport;
|
reqs[1].viewport = viewport;
|
||||||
@@ -308,7 +313,7 @@ void Renderer::DoReadPixels(int width, int height, unsigned char* rgb) {
|
|||||||
|
|
||||||
mjrfRenderRequest reqs[2];
|
mjrfRenderRequest reqs[2];
|
||||||
mjrf_defaultRenderRequest(&reqs[0]);
|
mjrf_defaultRenderRequest(&reqs[0]);
|
||||||
reqs[0].scene = scene_bridge_->GetScene();
|
reqs[0].scene = main_scene_.get();
|
||||||
reqs[0].draw_mode = draw_mode;
|
reqs[0].draw_mode = draw_mode;
|
||||||
reqs[0].camera = scene_bridge_->GetCamera();
|
reqs[0].camera = scene_bridge_->GetCamera();
|
||||||
reqs[0].target = target.get();
|
reqs[0].target = target.get();
|
||||||
@@ -317,7 +322,7 @@ void Renderer::DoReadPixels(int width, int height, unsigned char* rgb) {
|
|||||||
reqs[0].enable_reflections = scene_.flags[mjRND_REFLECTION];
|
reqs[0].enable_reflections = scene_.flags[mjRND_REFLECTION];
|
||||||
|
|
||||||
mjrf_defaultRenderRequest(&reqs[1]);
|
mjrf_defaultRenderRequest(&reqs[1]);
|
||||||
reqs[1].scene = imgui_bridge_->GetScene();
|
reqs[1].scene = ux_scene_.get();
|
||||||
reqs[1].draw_mode = mjDRAW_MODE_DEFAULT;
|
reqs[1].draw_mode = mjDRAW_MODE_DEFAULT;
|
||||||
reqs[1].camera = imgui_bridge_->GetCamera(viewport.width, viewport.height);
|
reqs[1].camera = imgui_bridge_->GetCamera(viewport.width, viewport.height);
|
||||||
reqs[1].target = target.get();
|
reqs[1].target = target.get();
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ class Renderer {
|
|||||||
|
|
||||||
// State used by the filament renderer.
|
// State used by the filament renderer.
|
||||||
UniquePtr<mjrfContext> filament_context_{nullptr, nullptr};
|
UniquePtr<mjrfContext> filament_context_{nullptr, nullptr};
|
||||||
|
UniquePtr<mjrfScene> main_scene_{nullptr, nullptr};
|
||||||
|
UniquePtr<mjrfScene> ux_scene_{nullptr, nullptr};
|
||||||
std::unique_ptr<SceneBridge> scene_bridge_;
|
std::unique_ptr<SceneBridge> scene_bridge_;
|
||||||
std::unique_ptr<ImguiBridge> imgui_bridge_;
|
std::unique_ptr<ImguiBridge> imgui_bridge_;
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ namespace mujoco {
|
|||||||
using filament::math::float3;
|
using filament::math::float3;
|
||||||
using filament::math::mat3f;
|
using filament::math::mat3f;
|
||||||
|
|
||||||
ImguiBridge::ImguiBridge(mjrfContext* ctx) : ctx_(ctx) {
|
ImguiBridge::ImguiBridge(mjrfContext* ctx, mjrfScene* scene)
|
||||||
|
: ctx_(ctx), scene_(scene) {
|
||||||
mjrfSceneParams params;
|
mjrfSceneParams params;
|
||||||
mjrf_defaultSceneParams(¶ms);
|
mjrf_defaultSceneParams(¶ms);
|
||||||
scene_ = CreateScene(ctx_, params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImguiBridge::~ImguiBridge() {
|
ImguiBridge::~ImguiBridge() {
|
||||||
@@ -287,16 +287,14 @@ void ImguiBridge::PrepareRenderables(int count) {
|
|||||||
params.receive_shadows = false;
|
params.receive_shadows = false;
|
||||||
params.blend_order = static_cast<std::uint16_t>(renderables_.size() + 1);
|
params.blend_order = static_cast<std::uint16_t>(renderables_.size() + 1);
|
||||||
auto& renderable = renderables_.emplace_back(CreateRenderable(ctx_, params));
|
auto& renderable = renderables_.emplace_back(CreateRenderable(ctx_, params));
|
||||||
mjrf_addRenderableToScene(scene_.get(), renderable.get());
|
mjrf_addRenderableToScene(scene_, renderable.get());
|
||||||
}
|
}
|
||||||
while (renderables_.size() > count) {
|
while (renderables_.size() > count) {
|
||||||
mjrf_removeRenderableFromScene(scene_.get(), renderables_.back().get());
|
mjrf_removeRenderableFromScene(scene_, renderables_.back().get());
|
||||||
renderables_.pop_back();
|
renderables_.pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mjrfScene* ImguiBridge::GetScene() const { return scene_.get(); }
|
|
||||||
|
|
||||||
mjrCamera ImguiBridge::GetCamera(int width, int height) const {
|
mjrCamera ImguiBridge::GetCamera(int width, int height) const {
|
||||||
mjrCamera camera;
|
mjrCamera camera;
|
||||||
camera.orthographic = true;
|
camera.orthographic = true;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace mujoco {
|
|||||||
// Creates and manages a SceneView using data read from ImGui.
|
// Creates and manages a SceneView using data read from ImGui.
|
||||||
class ImguiBridge {
|
class ImguiBridge {
|
||||||
public:
|
public:
|
||||||
explicit ImguiBridge(mjrfContext* ctx);
|
explicit ImguiBridge(mjrfContext* ctx, mjrfScene* scene);
|
||||||
~ImguiBridge();
|
~ImguiBridge();
|
||||||
|
|
||||||
// Prepares the Renderables using data from the current ImGui state. This
|
// Prepares the Renderables using data from the current ImGui state. This
|
||||||
@@ -36,8 +36,7 @@ class ImguiBridge {
|
|||||||
// synced.
|
// synced.
|
||||||
void Update();
|
void Update();
|
||||||
|
|
||||||
// Returns the managed UX scene.
|
// Returns the camera used for rendering the UX scene.
|
||||||
mjrfScene* GetScene() const;
|
|
||||||
mjrCamera GetCamera(int width, int height) const;
|
mjrCamera GetCamera(int width, int height) const;
|
||||||
|
|
||||||
// Uploads texture to be used with ImGui's Image and ImageButton functions.
|
// Uploads texture to be used with ImGui's Image and ImageButton functions.
|
||||||
@@ -58,7 +57,7 @@ class ImguiBridge {
|
|||||||
mjrfTexture* GetTexture(uintptr_t tex_id) const;
|
mjrfTexture* GetTexture(uintptr_t tex_id) const;
|
||||||
|
|
||||||
mjrfContext* ctx_ = nullptr;
|
mjrfContext* ctx_ = nullptr;
|
||||||
UniquePtr<mjrfScene> scene_{nullptr, nullptr};
|
mjrfScene* scene_ = nullptr;
|
||||||
std::vector<UniquePtr<mjrfRenderable>> renderables_;
|
std::vector<UniquePtr<mjrfRenderable>> renderables_;
|
||||||
std::vector<UniquePtr<mjrfMesh>> meshes_;
|
std::vector<UniquePtr<mjrfMesh>> meshes_;
|
||||||
std::unordered_map<uintptr_t, UniquePtr<mjrfTexture>> textures_;
|
std::unordered_map<uintptr_t, UniquePtr<mjrfTexture>> textures_;
|
||||||
|
|||||||
Reference in New Issue
Block a user