X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fobject.cpp;h=1852f91b50222ead401dfa177605c31d9d1ee21b;hp=637af62a3753becb9407e346fb471bad9213f94a;hb=HEAD;hpb=e042e093a4761f1227d4dd80d695e01642e17ffd diff --git a/source/object.cpp b/source/object.cpp deleted file mode 100644 index 637af62a..00000000 --- a/source/object.cpp +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include -#include "material.h" -#include "mesh.h" -#include "object.h" -#include "objectinstance.h" -#include "program.h" -#include "programdata.h" -#include "renderer.h" -#include "technique.h" -#include "texturing.h" - -using namespace std; - -namespace Msp { -namespace GL { - -Object::Object(): - meshes(1) -{ } - -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 out_of_range("Object::set_mesh"); - - if(i==meshes.size()) - meshes.push_back(m); - else - meshes[i] = m; - meshes[i].keep(); -} - -void Object::update_bounding_sphere() -{ - vector points; - for(vector >::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(); - return; - } - - unsigned n_vertices = vertices.size(); - points.reserve(points.size()+n_vertices); - for(unsigned j=0; j::from_point_cloud(points.begin(), points.end()); -} - -const Mesh *Object::get_mesh(unsigned i) const -{ - if(i>=meshes.size()) - return 0; - - return meshes[i].get(); -} - -void Object::set_technique(const Technique *t) -{ - technique = t; - technique.keep(); -} - -void Object::render(const Tag &tag) const -{ - const RenderPass *pass = get_pass(tag); - if(!pass) - return; - - Bind bind_shader(pass->get_shader_program()); - if(pass->get_shader_data()) - pass->get_shader_data()->apply(); - Bind bind_material(pass->get_material()); - Bind bind_texturing(pass->get_texturing()); - - meshes.front()->draw(); -} - -void Object::render(Renderer &renderer, const Tag &tag) const -{ - const RenderPass *pass = get_pass(tag); - if(!pass) - return; - - Renderer::Push push(renderer); - 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 -{ - const RenderPass *pass = get_pass(tag); - if(!pass) - return; - - Renderer::Push push(renderer); - pass->apply(renderer); - - setup_render(renderer, tag); - inst.setup_render(renderer, tag); - unsigned lod = min(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) - throw logic_error("!technique"); - if(!technique->has_pass(tag)) - return 0; - return &technique->get_pass(tag); -} - - -Object::Loader::Loader(Object &o): - DataFile::CollectionObjectLoader(o, 0) -{ - init(); -} - -Object::Loader::Loader(Object &o, Collection &c): - DataFile::CollectionObjectLoader(o, &c) -{ - init(); -} - -void Object::Loader::init() -{ - add("mesh", &Loader::mesh_inline); - add("mesh", &Loader::mesh_inline_lod); - add("mesh", &Loader::mesh); - add("mesh", &Loader::mesh_lod); - add("technique", &Loader::technique_inline); - add("technique", &Loader::technique); -} - -void Object::Loader::finish() -{ - obj.update_bounding_sphere(); -} - -void Object::Loader::mesh_inline() -{ - RefPtr msh = new Mesh; - load_sub(*msh); - obj.meshes.front() = msh; -} - -void Object::Loader::mesh_inline_lod(unsigned l) -{ - if(l>obj.meshes.size()) - throw out_of_range("Object::Loader::mesh_inline_lod"); - - RefPtr msh = new Mesh; - load_sub(*msh); - if(l==obj.meshes.size()) - obj.meshes.push_back(msh); - else - obj.meshes[l] = msh; -} - -void Object::Loader::mesh(const std::string &n) -{ - obj.set_mesh(&get_collection().get(n)); -} - -void Object::Loader::mesh_lod(unsigned l, const string &n) -{ - obj.set_mesh(l, &get_collection().get(n)); -} - -void Object::Loader::technique_inline() -{ - RefPtr tech = new Technique; - if(coll) - load_sub(*tech, get_collection()); - else - load_sub(*tech); - obj.technique = tech; -} - -void Object::Loader::technique(const std::string &n) -{ - obj.set_technique(&get_collection().get(n)); -} - -} // namespace GL -} // namespace Msp