From: Mikko Rasa Date: Wed, 10 Dec 2014 18:34:41 +0000 (+0200) Subject: Allow bounding sphere hints for objects and export such from Blender X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=84269f7b598673b06757313d70934a1747045b69 Allow bounding sphere hints for objects and export such from Blender --- diff --git a/blender/io_mspgl/export_object.py b/blender/io_mspgl/export_object.py index b910add1..b911ed36 100644 --- a/blender/io_mspgl/export_object.py +++ b/blender/io_mspgl/export_object.py @@ -1,4 +1,5 @@ import os +import mathutils def linear_to_srgb(l): if l<0.0031308: @@ -48,6 +49,18 @@ class ObjectExporter: 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): diff --git a/source/object.cpp b/source/object.cpp index fe1690d2..28389450 100644 --- a/source/object.cpp +++ b/source/object.cpp @@ -68,7 +68,7 @@ void Object::update_bounding_sphere() vector points; for(vector::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(); @@ -92,6 +92,11 @@ void Object::update_bounding_sphere() } } + /* 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::from_point_cloud(points.begin(), points.end()); } @@ -195,6 +200,7 @@ Object::Loader::Loader(Object &o, Collection &c): void Object::Loader::init() { + add("bounding_sphere_hint", &Loader::bounding_sphere_hint); add("level_of_detail", &Loader::level_of_detail); } @@ -203,6 +209,11 @@ void Object::Loader::finish() obj.update_bounding_sphere(); } +void Object::Loader::bounding_sphere_hint(float x, float y, float z, float r) +{ + obj.bounding_sphere = Geometry::BoundingSphere(Vector3(x, y, z), r); +} + void Object::Loader::level_of_detail(unsigned i) { LodLoader ldr(obj, i, coll); diff --git a/source/object.h b/source/object.h index 192cf069..a11bfd9b 100644 --- a/source/object.h +++ b/source/object.h @@ -59,6 +59,7 @@ public: void init(); virtual void finish(); + void bounding_sphere_hint(float, float, float, float); void level_of_detail(unsigned); };