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())
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;
};