set_technique(t);
}
+// Avoid synthesizing ~RefPtr in files including object.h
Object::~Object()
-{
-}
+{ }
void Object::set_mesh(unsigned i, const Mesh *m)
{
meshes[i].keep();
}
+void Object::update_bounding_sphere()
+{
+ vector<Vector3> points;
+ for(vector<RefPtr<const Mesh> >::const_iterator i=meshes.begin(); i!=meshes.end(); ++i)
+ {
+ const VertexArray &vertices = (*i)->get_vertices();
+ int offset = vertices.get_format().offset(VERTEX3);
+ if(offset<0)
+ {
+ // TODO Handle two-dimensional meshes
+ bounding_sphere = Geometry::BoundingSphere<float, 3>();
+ return;
+ }
+
+ unsigned n_vertices = vertices.size();
+ points.reserve(points.size()+n_vertices);
+ for(unsigned j=0; j<n_vertices; ++j)
+ {
+ const float *v = vertices[j];
+ points.push_back(Vector3(v[offset], v[offset+1], v[offset+2]));
+ }
+ }
+
+ bounding_sphere = Geometry::BoundingSphere<float, 3>::from_point_cloud(points.begin(), points.end());
+}
+
const Mesh *Object::get_mesh(unsigned i) const
{
if(i>=meshes.size())
return;
Renderer::Push push(renderer);
- renderer.set_shader_program(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_program(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(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);
}
add("lod_mesh", &Loader::mesh_lod);
}
+void Object::Loader::finish()
+{
+ obj.update_bounding_sphere();
+}
+
void Object::Loader::mesh_inline()
{
RefPtr<Mesh> msh = new Mesh;