meshes(1)
{ }
-Object::~Object()
+Object::Object(const Mesh *m, const Technique *t)
{
+ set_mesh(m);
+ set_technique(t);
}
+// Avoid synthesizing ~RefPtr in files including object.h
+Object::~Object()
+{ }
+
void Object::set_mesh(unsigned i, const Mesh *m)
{
if(i>meshes.size())
- throw invalid_argument("Object::set_mesh");
+ throw out_of_range("Object::set_mesh");
if(i==meshes.size())
meshes.push_back(m);
return;
Renderer::Push push(renderer);
- renderer.set_shader(pass->get_shader_program(), pass->get_shader_data());
- renderer.set_material(pass->get_material());
- renderer.set_texturing(pass->get_texturing());
+ pass->apply(renderer);
+ setup_render(renderer, tag);
meshes.front()->draw(renderer);
+ finish_render(renderer, tag);
}
void Object::render(Renderer &renderer, const ObjectInstance &inst, const Tag &tag) const
return;
Renderer::Push push(renderer);
- renderer.set_shader(pass->get_shader_program(), pass->get_shader_data());
- renderer.set_material(pass->get_material());
- renderer.set_texturing(pass->get_texturing());
+ pass->apply(renderer);
+ setup_render(renderer, tag);
inst.setup_render(renderer, tag);
- unsigned lod = min<unsigned>(inst.get_level_of_detail(), meshes.size()-1);
+ unsigned lod = min<unsigned>(inst.get_level_of_detail(renderer), meshes.size()-1);
meshes[lod]->draw(renderer);
inst.finish_render(renderer, tag);
+ finish_render(renderer, tag);
}
const RenderPass *Object::get_pass(const Tag &tag) const
{
- if(!technique || !technique->has_pass(tag))
+ if(!technique)
+ throw logic_error("!technique");
+ if(!technique->has_pass(tag))
return 0;
return &technique->get_pass(tag);
}
void Object::Loader::mesh_inline_lod(unsigned l)
{
if(l>obj.meshes.size())
- throw invalid_argument("Object::Loader::mesh_inline_lod");
+ throw out_of_range("Object::Loader::mesh_inline_lod");
RefPtr<Mesh> msh = new Mesh;
load_sub(*msh);