diff options
author | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-21 13:21:15 +0400 |
---|---|---|
committer | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-21 13:21:15 +0400 |
commit | e957b12f0eb5ae56f6db1c64d123eacc0840cc61 (patch) | |
tree | b8ed8f092619edb303cf34aba11b0999ad317d40 /source/gameengine/Converter | |
parent | 1217928e662bd74980dc17c8d32797b0bc6f7002 (diff) |
Frustum sphere culling.
Do a sphere<->camera sphere and a sphere<->frustum before the box<->frustum test.
Diffstat (limited to 'source/gameengine/Converter')
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 25 | ||||
-rw-r--r-- | source/gameengine/Converter/KX_BlenderSceneConverter.cpp | 2 |
2 files changed, 20 insertions, 7 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index f51bf955f51..dbe68b96fac 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -39,6 +39,8 @@ #pragma warning (disable : 4786) #endif +#include <math.h> + #include "BL_BlenderDataConversion.h" #include "KX_BlenderGL.h" #include "KX_BlenderScalarInterpolator.h" @@ -523,12 +525,11 @@ static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blendero - -void my_boundbox_mesh(Mesh *me, float *loc, float *size) - { +float my_boundbox_mesh(Mesh *me, float *loc, float *size) +{ MVert *mvert; BoundBox *bb; - float min[3], max[3]; + MT_Point3 min, max; float mloc[3], msize[3]; int a; @@ -543,7 +544,7 @@ void my_boundbox_mesh(Mesh *me, float *loc, float *size) mvert= me->mvert; for(a=0; a<me->totvert; a++, mvert++) { DO_MINMAX(mvert->co, min, max); - } + } if(me->totvert) { loc[0]= (min[0]+max[0])/2.0; @@ -567,7 +568,16 @@ void my_boundbox_mesh(Mesh *me, float *loc, float *size) bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= loc[2]-size[2]; bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= loc[2]+size[2]; - } + + float radius = 0; + for (a=0, mvert = me->mvert; a < me->totvert; a++, mvert++) + { + float vert_radius = MT_Vector3(mvert->co).length2(); + if (vert_radius > radius) + radius = vert_radius; + } + return sqrt(radius); +} @@ -863,7 +873,7 @@ static KX_GameObject *gameobject_from_blenderobject( Mesh* mesh = static_cast<Mesh*>(ob->data); RAS_MeshObject* meshobj = converter->FindGameMesh(mesh, ob->lay); float centre[3], extents[3]; - my_boundbox_mesh((Mesh*) ob->data, centre, extents); + float radius = my_boundbox_mesh((Mesh*) ob->data, centre, extents); if (!meshobj) { meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter); @@ -898,6 +908,7 @@ static KX_GameObject *gameobject_from_blenderobject( MT_Point3 max = MT_Point3(centre) + MT_Vector3(extents); SG_BBox bbox = SG_BBox(min, max); gameobj->GetSGNode()->SetBBox(bbox); + gameobj->GetSGNode()->SetRadius(radius); break; } diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 8e552d3f3d4..f7eb25a70a6 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -118,7 +118,9 @@ KX_BlenderSceneConverter::~KX_BlenderSceneConverter() itm++; } +#ifdef USE_SUMO_SOLID KX_ClearSumoSharedShapes(); +#endif } |