From 2f9446679bcc8c92e99026fb7a908866cbd1504c Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 7 Jul 2024 17:44:12 +0300 Subject: [PATCH] Refactor Object::render to have less duplication --- source/render/object.cpp | 48 ++++++++++++++-------------------------- source/render/object.h | 4 ++-- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/source/render/object.cpp b/source/render/object.cpp index 0888aa9f..04ccbb6b 100644 --- a/source/render/object.cpp +++ b/source/render/object.cpp @@ -147,53 +147,39 @@ const Technique *Object::get_technique(unsigned i) const void Object::render(Renderer &renderer, Tag tag) const { - const RenderMethod *method = get_method(tag, 0); - if(!method) - return; - - const Mesh *mesh = lods.front().mesh; - if (!mesh) - throw logic_error("no mesh"); - - Renderer::Push push(renderer); - renderer.set_pipeline_key(this, tag.id); - method->apply(renderer); - - setup_render(renderer, tag); - mesh->draw(renderer); - finish_render(renderer, tag); + render(renderer, 0, nullptr, tag); } void Object::render(Renderer &renderer, const ObjectInstance &inst, Tag tag) const { unsigned lod = min(inst.get_level_of_detail(renderer), lods.size()-1); - const RenderMethod *method = get_method(tag, lod); - if(!method) - return; + render(renderer, lod, &inst, tag); +} +void Object::render(Renderer &renderer, unsigned lod, const ObjectInstance *inst, Tag tag) const +{ + Renderer::Push push(renderer); const Mesh *mesh = lods[lod].mesh; - if (!mesh) - throw logic_error("no mesh"); + const Technique *tech = lods[lod].technique; + if(!mesh || !tech) + return; + + const RenderMethod *method = tech->find_method(tag); + if(!method) + return; - Renderer::Push push(renderer); renderer.set_pipeline_key(this, tag.id); method->apply(renderer); setup_render(renderer, tag); - inst.setup_render(renderer, tag); + if(inst) + inst->setup_render(renderer, tag); mesh->draw(renderer); - inst.finish_render(renderer, tag); + if(inst) + inst->finish_render(renderer, tag); finish_render(renderer, tag); } -const RenderMethod *Object::get_method(Tag tag, unsigned lod) const -{ - const Technique *tech = lods[lod].technique; - if(!tech) - throw logic_error("no technique"); - return tech->find_method(tag); -} - void Object::resource_loaded(Resource &res) { if(&res==lods.front().mesh && bounding_sphere.is_empty()) diff --git a/source/render/object.h b/source/render/object.h index 9fd788d1..f4fa2384 100644 --- a/source/render/object.h +++ b/source/render/object.h @@ -121,12 +121,12 @@ public: virtual void render(Renderer &, const ObjectInstance &, Tag = Tag()) const; protected: + void render(Renderer &, unsigned, const ObjectInstance *, Tag) const; + virtual void setup_render(Renderer &, Tag) const { } virtual void finish_render(Renderer &, Tag) const { } private: - const RenderMethod *get_method(Tag, unsigned) const; - void resource_loaded(Resource &) override; void resource_removed(Resource &) override; }; -- 2.45.2