import os
+import mathutils
def linear_to_srgb(l):
if l<0.0031308:
from .outfile import open_output
out_file = open_output(out_file)
+ p1 = max(((v.co, v.co.length) for v in obj.data.vertices), key=lambda x:x[1])[0]
+ p2 = max(((v.co, (v.co-p1).length) for v in obj.data.vertices), key=lambda x:x[1])[0]
+ center = (p1+p2)/2
+ radius = (p1-p2).length/2
+ for v in obj.data.vertices:
+ d = v.co-center
+ if d.length>radius:
+ center += d*(1-radius/d.length)/2
+ radius = (radius+d.length)/2
+
+ out_file.write("bounding_sphere_hint", center[0], center[1], center[2], radius)
+
prev_mesh = None
prev_tech = (None, None)
for i, l in enumerate(lods):
vector<Vector3> points;
for(vector<LevelOfDetail>::const_iterator i=lods.begin(); i!=lods.end(); ++i)
{
- if(!i->mesh)
+ if(!i->mesh || !i->mesh->is_loaded())
continue;
const VertexArray &vertices = i->mesh->get_vertices();
}
}
+ /* Don't touch the bounding sphere if we had no vertices to avoid
+ overwriting a possible hint. */
+ if(points.empty())
+ return;
+
bounding_sphere = Geometry::BoundingSphere<float, 3>::from_point_cloud(points.begin(), points.end());
}
void Object::Loader::init()
{
+ add("bounding_sphere_hint", &Loader::bounding_sphere_hint);
add("level_of_detail", &Loader::level_of_detail);
}
obj.update_bounding_sphere();
}
+void Object::Loader::bounding_sphere_hint(float x, float y, float z, float r)
+{
+ obj.bounding_sphere = Geometry::BoundingSphere<float, 3>(Vector3(x, y, z), r);
+}
+
void Object::Loader::level_of_detail(unsigned i)
{
LodLoader ldr(obj, i, coll);
void init();
virtual void finish();
+ void bounding_sphere_hint(float, float, float, float);
void level_of_detail(unsigned);
};