]> git.tdb.fi Git - libs/gl.git/commitdiff
Refactor Object::render to have less duplication
authorMikko Rasa <tdb@tdb.fi>
Sun, 7 Jul 2024 14:44:12 +0000 (17:44 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 7 Jul 2024 14:44:32 +0000 (17:44 +0300)
source/render/object.cpp
source/render/object.h

index 0888aa9fda27aee12bacef43733002868f500ee8..04ccbb6b994007b6057dbbbc08f3f6fcf443ba3a 100644 (file)
@@ -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<unsigned>(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())
index 9fd788d1b5d53070e6b3b8b8f5699c228849d11b..f4fa23847b394c2b22a4c3727d64493b72768217 100644 (file)
@@ -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;
 };