#include "program.h"
#include "programdata.h"
#include "renderer.h"
+#include "resourcemanager.h"
#include "technique.h"
#include "texturing.h"
// Avoid synthesizing ~RefPtr in files including object.h
Object::~Object()
-{ }
+{
+ if(meshes[0])
+ if(ResourceManager *rm = meshes[0]->get_manager())
+ rm->unwatch_resource(*meshes[0], *this);
+}
void Object::set_mesh(unsigned i, const Mesh *m)
{
if(i==meshes.size())
meshes.push_back(m);
else
+ {
+ if(i==0 && meshes[i])
+ if(ResourceManager *rm = meshes[i]->get_manager())
+ rm->unwatch_resource(*meshes[i], *this);
meshes[i] = m;
+ }
meshes[i].keep();
+
+ if(i==0 && m)
+ if(ResourceManager *rm = m->get_manager())
+ rm->watch_resource(*m, *this);
+
+ update_bounding_sphere();
}
void Object::update_bounding_sphere()
vector<Vector3> points;
for(vector<RefPtr<const Mesh> >::const_iterator i=meshes.begin(); i!=meshes.end(); ++i)
{
+ if(!*i)
+ continue;
+
const VertexArray &vertices = (*i)->get_vertices();
+
int offset = vertices.get_format().offset(VERTEX3);
+ bool three = true;
if(offset<0)
{
- // TODO Handle two-dimensional meshes
- bounding_sphere = Geometry::BoundingSphere<float, 3>();
- return;
+ offset = vertices.get_format().offset(VERTEX2);
+ three = false;
+ if(offset<0)
+ continue;
}
unsigned n_vertices = vertices.size();
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]));
+ points.push_back(Vector3(v[offset], v[offset+1], (three ? v[offset+2] : 0.0f)));
}
}
return &technique->get_pass(tag);
}
+void Object::resource_loaded(Resource &res)
+{
+ if(!meshes.empty() && &res==meshes.front().get() && bounding_sphere.is_empty())
+ update_bounding_sphere();
+}
+
Object::Loader::Loader(Object &o):
DataFile::CollectionObjectLoader<Object>(o, 0)