diff --git a/src/Makefile.am b/src/Makefile.am index 65504d8bb..811476ac2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -51,6 +51,7 @@ supertuxkart_SOURCES = main.cpp \ audio/sfx_openal.cpp audio/sfx_openal.hpp \ audio/sound_manager.cpp audio/sound_manager.hpp \ utils/random_generator.hpp utils/random_generator.cpp \ + utils/ssg_help.cpp tuils/ssg_help.hpp \ material_manager.cpp material_manager.hpp \ grand_prix_manager.cpp grand_prix_manager.hpp \ attachment.cpp attachment.hpp \ @@ -91,7 +92,6 @@ supertuxkart_SOURCES = main.cpp \ camera.cpp camera.hpp \ sdldrv.cpp sdldrv.hpp \ moveable.cpp moveable.hpp \ - ssg_help.cpp ssg_help.hpp \ kart.cpp kart.hpp \ auto_kart.hpp \ player_kart.cpp player_kart.hpp \ diff --git a/src/flyable.cpp b/src/flyable.cpp index 360d256a2..edfe39f19 100644 --- a/src/flyable.cpp +++ b/src/flyable.cpp @@ -26,7 +26,7 @@ #include "projectile_manager.hpp" #include "callback_manager.hpp" #include "scene.hpp" -#include "ssg_help.hpp" +#include "utils/ssg_help.hpp" // static variables: float Flyable::m_st_speed[COLLECT_MAX]; @@ -108,9 +108,10 @@ void Flyable::init(const lisp::Lisp* lisp, ssgEntity *model, lisp->get("force-updown", m_st_force_updown[type]); // Store the size of the model - float x_min, x_max, y_min, y_max, z_min, z_max; - MinMax(model, &x_min, &x_max, &y_min, &y_max, &z_min, &z_max); - m_st_extend[type] = btVector3(x_max-x_min,y_max-y_min, z_max-z_min); + Vec3 min, max; + + SSGHelp::MinMax(model, &min, &max); + m_st_extend[type] = btVector3(max-min); m_st_model[type] = model; } // init diff --git a/src/ide/vc9/supertuxkart.vcproj b/src/ide/vc9/supertuxkart.vcproj index 3e3a4aec3..2c466a47b 100644 --- a/src/ide/vc9/supertuxkart.vcproj +++ b/src/ide/vc9/supertuxkart.vcproj @@ -851,10 +851,6 @@ RelativePath="..\..\smoke.cpp" > - - @@ -1110,6 +1106,10 @@ RelativePath="..\..\utils\random_generator.cpp" > + + + + getName(), "WheelFront.L") == 0) { - m_wheel_front_l = add_transform(dynamic_cast(i)); + m_wheel_front_l = SSGHelp::add_transform(dynamic_cast(i)); } else if (strcmp(i->getName(), "WheelFront.R") == 0) { - m_wheel_front_r = add_transform(dynamic_cast(i)); + m_wheel_front_r = SSGHelp::add_transform(dynamic_cast(i)); } else if (strcmp(i->getName(), "WheelRear.L") == 0) { - m_wheel_rear_l = add_transform(dynamic_cast(i)); + m_wheel_rear_l = SSGHelp::add_transform(dynamic_cast(i)); } else if (strcmp(i->getName(), "WheelRear.R") == 0) { - m_wheel_rear_r = add_transform(dynamic_cast(i)); + m_wheel_rear_r = SSGHelp::add_transform(dynamic_cast(i)); } else { @@ -1109,7 +1109,7 @@ void Kart::loadData() // else needed to load the wheels as a separate object. ssgFlatten(obj); - createDisplayLists(obj); // create all display lists + SSGHelp::createDisplayLists(obj); // create all display lists ssgRangeSelector *lod = new ssgRangeSelector ; lod -> addKid ( obj ) ; diff --git a/src/kart_properties.cpp b/src/kart_properties.cpp index 4995cd9ef..71a77efc8 100644 --- a/src/kart_properties.cpp +++ b/src/kart_properties.cpp @@ -17,20 +17,21 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include "kart_properties.hpp" + #include #include #include #include "material_manager.hpp" -#include "lisp/parser.hpp" -#include "lisp/lisp.hpp" #include "loader.hpp" #include "file_manager.hpp" #include "string_utils.hpp" -#include "kart_properties.hpp" #include "stk_config.hpp" #include "translation.hpp" -#include "ssg_help.hpp" #include "user_config.hpp" +#include "lisp/parser.hpp" +#include "lisp/lisp.hpp" +#include "utils/ssg_help.hpp" #if defined(WIN32) && !defined(__CYGWIN__) # define snprintf _snprintf @@ -103,11 +104,11 @@ void KartProperties::load(const std::string filename, const std::string node, return; } ssgStripify(m_model); - float x_min, x_max, y_min, y_max, z_min, z_max; - MinMax(m_model, &x_min, &x_max, &y_min, &y_max, &z_min, &z_max); - m_kart_width = x_max - x_min; - m_kart_length = y_max - y_min; - m_kart_height = z_max - z_min; + Vec3 min, max; + SSGHelp::MinMax(m_model, &min, &max); + m_kart_width = max.getX()-min.getY(); + m_kart_length = max.getY()-min.getY(); + m_kart_height = max.getZ()-min.getZ(); // Useful when tweaking kart parameters if(user_config->m_print_kart_sizes) diff --git a/src/moving_physics.cpp b/src/moving_physics.cpp index 4716823a0..fc1f78d64 100644 --- a/src/moving_physics.cpp +++ b/src/moving_physics.cpp @@ -17,15 +17,17 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include "moving_physics.hpp" + #include #include #define _WINSOCKAPI_ #include -#include "moving_physics.hpp" + #include "string_utils.hpp" #include "world.hpp" -#include "ssg_help.hpp" #include "scene.hpp" +#include "utils/ssg_help.hpp" // ----------------------------------------------------------------------------- MovingPhysics::MovingPhysics(const std::string data) @@ -152,25 +154,28 @@ void MovingPhysics::init() // 3. Determine size of the object // ------------------------------- - float x_min, x_max, y_min, y_max, z_min, z_max, radius; - MinMax(this, &x_min, &x_max, &y_min, &y_max, &z_min, &z_max); - m_half_height = 0.5f*(z_max-z_min); + Vec3 min, max; + SSGHelp::MinMax(this, &min, &max); + Vec3 extend = max-min; + m_half_height = 0.5f*(extend.getZ()); switch (m_body_type) { - case MP_CONE: radius = 0.5f*std::max(x_max-x_min, y_max-y_min); - m_shape = new btConeShapeZ(radius, z_max-z_min); + case MP_CONE: { + float radius = 0.5f*std::max(extend.getX(), extend.getY()); + m_shape = new btConeShapeZ(radius, extend.getZ()); setName("cone"); break; - case MP_BOX: m_shape = new btBoxShape(btVector3(0.5f*(x_max-x_min), - 0.5f*(y_max-y_min), - 0.5f*(z_max-z_min) ) ); + } + case MP_BOX: m_shape = new btBoxShape(0.5*extend); setName("box"); break; - case MP_SPHERE: radius = std::max(x_max-x_min, y_max-y_min); - radius = 0.5f*std::max(radius, z_max-z_min); + case MP_SPHERE: { + float radius = std::max(extend.getX(), extend.getY()); + radius = 0.5f*std::max(radius, extend.getZ()); m_shape = new btSphereShape(radius); setName("sphere"); break; + } case MP_NONE: fprintf(stderr, "WARNING: Uninitialised moving shape\n"); break; } diff --git a/src/physics.cpp b/src/physics.cpp index f0fa81a65..b5897721c 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -18,41 +18,46 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "physics.hpp" -#include "ssg_help.hpp" + #include "world.hpp" #include "flyable.hpp" #include "moving_physics.hpp" #include "user_config.hpp" #include "material_manager.hpp" #include "network/race_state.hpp" +#include "utils/ssg_help.hpp" // ---------------------------------------------------------------------------- /** Initialise physics. * Create the bullet dynamics world. */ -Physics::Physics(float gravity) : btSequentialImpulseConstraintSolver() +Physics::Physics() : btSequentialImpulseConstraintSolver() { m_collision_conf = new btDefaultCollisionConfiguration(); m_dispatcher = new btCollisionDispatcher(m_collision_conf); - - // FIXME: it might be better to use the track dimension here, but they - // are not known at this stage. - btVector3 worldMin(-1000, -1000, -1000); - btVector3 worldMax( 1000, 1000, 1000); - m_axis_sweep = new btAxisSweep3(worldMin, worldMax); +} // Physics + +//----------------------------------------------------------------------------- +/** The actual initialisation of the physics, which is called after the track + * model is loaded. This allows the physics to use the actual track dimension + * for the axis sweep. + */ +void Physics::init(const Vec3 &world_min, const Vec3 &world_max) +{ + m_axis_sweep = new btAxisSweep3(world_min, world_max); m_dynamics_world = new btDiscreteDynamicsWorld(m_dispatcher, m_axis_sweep, this, m_collision_conf); - m_dynamics_world->setGravity(btVector3(0.0f, 0.0f, -gravity)); + m_dynamics_world->setGravity(btVector3(0.0f, 0.0f, + -world->getTrack()->getGravity())); if(user_config->m_bullet_debug) { m_debug_drawer=new GLDebugDrawer(); m_debug_drawer->setDebugMode(btIDebugDraw::DBG_DrawWireframe); m_dynamics_world->setDebugDrawer(m_debug_drawer); } -} // Physics - +} // init //----------------------------------------------------------------------------- Physics::~Physics() { diff --git a/src/physics.hpp b/src/physics.hpp index 69e522b41..f047a8690 100644 --- a/src/physics.hpp +++ b/src/physics.hpp @@ -69,9 +69,9 @@ private: }; // CollisionPair bool operator==(const CollisionPair p) { return (p.a==a && p.b==b); - } - }; - + } // operator== + }; // CollisionPair + // ------------------------------------------------------------------------ // This class is the list of collision objects, where each collision // pair is stored as most once. class CollisionList : public std::vector { @@ -88,12 +88,13 @@ private: push_back(CollisionPair(a, b)); } }; // CollisionList - + // ------------------------------------------------------------------------ CollisionList m_all_collisions; public: - Physics (float gravity); + Physics (); ~Physics (); + void init (const Vec3 &min_world, const Vec3 &max_world); void addKart (const Kart *k, btRaycastVehicle *v); void addBody (btRigidBody* b) {m_dynamics_world->addRigidBody(b);} void removeKart (const Kart *k); diff --git a/src/ssg_help.cpp b/src/ssg_help.cpp deleted file mode 100644 index 32363ca99..000000000 --- a/src/ssg_help.cpp +++ /dev/null @@ -1,216 +0,0 @@ -// $Id: ssg_help.cpp 837 2006-10-23 07:43:05Z hiker $ -// -// SuperTuxKart - a fun racing game with go-kart -// Copyright (C) 2004-2005 Steve Baker -// Copyright (C) 2006 SuperTuxKart-Team, Joerg Henrichs, Steve Baker -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 3 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - - -#include -#include -#include "ssg_help.hpp" - -// ----------------------------------------------------------------------------- -/** Make VtTables use display lists. - * - * Calls recursively 'makeDList' in all ssgVtxTable of the entity. - * \param entity Tree in which to create display lists. - */ -void createDisplayLists(ssgEntity* entity) -{ - if (!entity) return; - - ssgVtxTable* table = dynamic_cast(entity); - if(table) - { - if(table->getNumTriangles()>1) table->makeDList(); - } - ssgBranch* branch = dynamic_cast(entity); - - if (branch) - { - for(ssgEntity* i = branch->getKid(0); i != NULL; - i = branch->getNextKid()) - { - createDisplayLists(i); - } // for - } // if branch - -} // createDisplayLists - -// ----------------------------------------------------------------------------- -/** Adds a transform node to the branch. - * - * Creates a new ssgTransform node to which all children of the branch are - * added. The new ssgTransform is then set as the only child of the - * branch. - * \param branch The branch to which a transform node is added. - */ -ssgTransform* add_transform(ssgBranch* branch) -{ - if (!branch) return 0; - - ssgTransform* transform = new ssgTransform; - transform->ref(); - for(ssgEntity* i = branch->getKid(0); i != NULL; i = branch->getNextKid()) - { - transform->addKid(i); - } - - branch->removeAllKids(); - branch->addKid(transform); - - // Set some user data, so that the wheel isn't ssgFlatten()'ed - branch->setUserData(new ssgBase()); - transform->setUserData(new ssgBase()); - - return transform; -} // add_transform - -// ----------------------------------------------------------------------------- -/** Recursively prints a model. - * - * Recursively prints a model. That function can most likely be removed, the - * print method of the ssg objects do the same. - * \param entity The entity ro print (can't be constant because of ssg functions - * which are not const correct) - * \param indent Indentation to use - * \param maxLevel maximum number of levels to print - */ -void print_model(ssgEntity* entity, const int indent, const int maxLevel) -{ - if(maxLevel <0) return; - if (entity) - { - for(int i = 0; i < indent; ++i) - std::cout << " "; - - std::cout << entity->getTypeName() << " " << entity->getType() << " '" - << entity->getPrintableName() - << "' '" - << (entity->getName() ? entity->getName() : "null") - << "' " << entity << std::endl; - - ssgBranch* branch = dynamic_cast(entity); - - if (branch) - { - for(ssgEntity* i = branch->getKid(0); i != NULL; - i = branch->getNextKid()) - { - print_model(i, indent + 1, maxLevel-1); - } - } // if branch - } // if entity -} // print_model - -// ----------------------------------------------------------------------------- -/** Computes the minimum and maximum x/y coordinates for a ssgEntity. - * - * Recursively computes the minimum x and y coordinates of a ssgEntity. - * \param p ssgEntity for which t compute the extend (can't be constant because - * of plib not const correct) - * \param x_min minimum x value - * \param x_max maximum x value - * \param y_min minimum y value - * \param y_max maximum y value - * \param z_min minimum z value, optional parameter! - * \param z_max minimum z value, optional parameter! - */ -void MinMax(ssgEntity* p, float *x_min, float *x_max, - float *y_min, float *y_max, - float *z_min, float *z_max) -{ - sgMat4 mat; - sgMakeIdentMat4(mat); - *x_min = *y_min = 10000.0f; if(z_min) *z_min = 10000.0f; - *x_max = *y_max = -10000.0f; if(z_max) *z_max = -10000.0f; - MinMax(p, mat, x_min, x_max, y_min, y_max, z_min, z_max); - -} // MinMax - -/** Internal function used by MinMax. */ -void MinMax(ssgEntity* p, sgMat4 m, float* x_min, float* x_max, - float* y_min, float* y_max, - float* z_min, float* z_max) -{ - if(p->isAKindOf(ssgTypeLeaf())) - { - ssgLeaf* l=(ssgLeaf*)p; - for(int i=0; igetNumTriangles(); i++) - { - short v1,v2,v3; - sgVec3 vv1, vv2, vv3; - - l->getTriangle(i, &v1, &v2, &v3); - - sgXformPnt3 ( vv1, l->getVertex(v1), m ); - sgXformPnt3 ( vv2, l->getVertex(v2), m ); - sgXformPnt3 ( vv3, l->getVertex(v3), m ); - *x_min = std::min(*x_min, vv1[0]); *x_max = std::max(*x_max, vv1[0]); - *x_min = std::min(*x_min, vv2[0]); *x_max = std::max(*x_max, vv2[0]); - *x_min = std::min(*x_min, vv3[0]); *x_max = std::max(*x_max, vv3[0]); - *y_min = std::min(*y_min, vv1[1]); *y_max = std::max(*y_max, vv1[1]); - *y_min = std::min(*y_min, vv2[1]); *y_max = std::max(*y_max, vv2[1]); - *y_min = std::min(*y_min, vv3[1]); *y_max = std::max(*y_max, vv3[1]); - if(z_min) - { - *z_min = std::min(*z_min, vv1[2]); - *z_min = std::min(*z_min, vv2[2]); - *z_min = std::min(*z_min, vv3[2]); - } - if(z_max) - { - *z_max = std::max(*z_max, vv1[2]); - *z_max = std::max(*z_max, vv2[2]); - *z_max = std::max(*z_max, vv3[2]); - } - - } // for igetNumTriangles - } - else if (p->isAKindOf(ssgTypeTransform())) - { - ssgBaseTransform* t=(ssgBaseTransform*)p; - - sgMat4 tmpT, tmpM; - t->getTransform(tmpT); - sgCopyMat4(tmpM, m); - sgPreMultMat4(tmpM,tmpT); - - for(ssgEntity* e=t->getKid(0); e!=NULL; e=t->getNextKid()) - { - MinMax(e, tmpM, x_min, x_max, y_min, y_max, z_min, z_max); - } // for iisAKindOf(ssgTypeBranch())) - { - ssgBranch* b =(ssgBranch*)p; - for(ssgEntity* e=b->getKid(0); e!=NULL; e=b->getNextKid()) - { - MinMax(e, m, x_min, x_max, y_min, y_max, z_min, z_max); - } // for iprint(stdout, 0, 0); - } -} // MinMax - -// ----------------------------------------------------------------------------- - -/* EOF */ diff --git a/src/static_ssg.cpp b/src/static_ssg.cpp index 8fe161ac6..e27dd5a21 100644 --- a/src/static_ssg.cpp +++ b/src/static_ssg.cpp @@ -18,11 +18,14 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#include + #include "static_ssg.hpp" + +#include + #include "material_manager.hpp" #include "material.hpp" -#include "ssg_help.hpp" +#include "utils/ssg_help.hpp" #ifndef round # define round(x) (floor(x+0.5f)) @@ -41,7 +44,12 @@ StaticSSG::StaticSSG(ssgEntity* start_, int nSize) void StaticSSG::Setup(int nSize) { // First compute the minimum and maximum x/y values of all leaves - MinMax(m_start, &m_x_min, &m_x_max, &m_y_min, &m_y_max); + Vec3 min, max; + SSGHelp::MinMax(m_start, &min, &max); + m_x_min = min.getX(); + m_x_max = max.getX(); + m_y_min = min.getY(); + m_y_max = max.getY(); const float RATIO = (m_x_max-m_x_min)/(m_y_max-m_y_min); diff --git a/src/track.cpp b/src/track.cpp index 631b757aa..1b5526d10 100644 --- a/src/track.cpp +++ b/src/track.cpp @@ -17,14 +17,16 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include "track.hpp" + #include #include #include #define _WINSOCKAPI_ #include + #include "file_manager.hpp" #include "loader.hpp" -#include "track.hpp" #include "string_utils.hpp" #include "lisp/lisp.hpp" #include "lisp/parser.hpp" @@ -35,12 +37,12 @@ #include "world.hpp" #include "material_manager.hpp" #include "isect.hpp" -#include "ssg_help.hpp" #include "user_config.hpp" #include "herring.hpp" #include "herring_manager.hpp" -#include "audio/sound_manager.hpp" #include "race_manager.hpp" +#include "audio/sound_manager.hpp" +#include "utils/ssg_help.hpp" #if defined(WIN32) && !defined(__CYGWIN__) # define snprintf _snprintf @@ -1278,7 +1280,7 @@ void Track::loadTrackModel() file_manager->popModelSearchPath (); throw std::runtime_error(msg); } - createDisplayLists(obj); + SSGHelp::createDisplayLists(obj); ssgRangeSelector *lod = new ssgRangeSelector ; ssgTransform *trans = new ssgTransform ( & loc ) ; @@ -1307,6 +1309,9 @@ void Track::loadTrackModel() file_manager->popTextureSearchPath(); file_manager->popModelSearchPath (); + Vec3 min, max; + SSGHelp::MinMax(m_model, &min, &max); + world->getPhysics()->init(min, max); createPhysicsModel(); } // loadTrack diff --git a/src/utils/ssg_help.cpp b/src/utils/ssg_help.cpp new file mode 100644 index 000000000..e1f0e18a2 --- /dev/null +++ b/src/utils/ssg_help.cpp @@ -0,0 +1,205 @@ +// $Id: ssg_help.cpp 837 2006-10-23 07:43:05Z hiker $ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2004-2005 Steve Baker +// Copyright (C) 2006 SuperTuxKart-Team, Joerg Henrichs, Steve Baker +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "utils/ssg_help.hpp" + +#include +#include + +namespace SSGHelp +{ + // ------------------------------------------------------------------------ + /** Make VtTables use display lists. + * + * Calls recursively 'makeDList' in all ssgVtxTable of the entity. + * \param entity Tree in which to create display lists. + */ + void createDisplayLists(ssgEntity* entity) + { + if (!entity) return; + + ssgVtxTable* table = dynamic_cast(entity); + if(table) + { + if(table->getNumTriangles()>1) table->makeDList(); + } + ssgBranch* branch = dynamic_cast(entity); + + if (branch) + { + for(ssgEntity* i = branch->getKid(0); i != NULL; + i = branch->getNextKid()) + { + createDisplayLists(i); + } // for + } // if branch + + } // createDisplayLists + + // ------------------------------------------------------------------------- + /** Adds a transform node to the branch. + * + * Creates a new ssgTransform node to which all children of the branch are + * added. The new ssgTransform is then set as the only child of the + * branch. + * \param branch The branch to which a transform node is added. + */ + ssgTransform* add_transform(ssgBranch* branch) + { + if (!branch) return 0; + + ssgTransform* transform = new ssgTransform; + transform->ref(); + for(ssgEntity* i = branch->getKid(0); i != NULL; + i = branch->getNextKid()) + { + transform->addKid(i); + } + + branch->removeAllKids(); + branch->addKid(transform); + + // Set some user data, so that the wheel isn't ssgFlatten()'ed + branch->setUserData(new ssgBase()); + transform->setUserData(new ssgBase()); + + return transform; + } // add_transform + + // ------------------------------------------------------------------------ + /** Recursively prints a model. + * + * Recursively prints a model. That function can most likely be removed, the + * print method of the ssg objects do the same. + * \param entity The entity ro print (can't be constant because of ssg + * functions which are not const correct) + * \param indent Indentation to use + * \param maxLevel maximum number of levels to print + */ + void print_model(ssgEntity* entity, const int indent, const int maxLevel) + { + if(maxLevel <0) return; + if (entity) + { + for(int i = 0; i < indent; ++i) + std::cout << " "; + + std::cout << entity->getTypeName() << " " << entity->getType() + << " '" + << entity->getPrintableName() + << "' '" + << (entity->getName() ? entity->getName() : "null") + << "' " << entity << std::endl; + + ssgBranch* branch = dynamic_cast(entity); + + if (branch) + { + for(ssgEntity* i = branch->getKid(0); i != NULL; + i = branch->getNextKid()) + { + print_model(i, indent + 1, maxLevel-1); + } + } // if branch + } // if entity + } // print_model + + // ------------------------------------------------------------------------ + /** MinMax helper function which uses a transform and then computes the + * minimum/maximum for this subtree. + * \param p Subtree. + * \param m Transformation to apply. + * \param min On return contains the minimum. + * \param max On return contains the maximum. + */ + static void MinMaxInternal(const ssgEntity* p, sgMat4 m, Vec3 *min, Vec3 *max) + { + if(const_cast(p)->isAKindOf(ssgTypeLeaf())) + { + ssgLeaf* l=(ssgLeaf*)p; + for(int i=0; igetNumTriangles(); i++) + { + short v1,v2,v3; + sgVec3 vv1, vv2, vv3; + + l->getTriangle(i, &v1, &v2, &v3); + + sgXformPnt3 ( vv1, l->getVertex(v1), m ); + sgXformPnt3 ( vv2, l->getVertex(v2), m ); + sgXformPnt3 ( vv3, l->getVertex(v3), m ); + Vec3 vec3vv1(vv1); + Vec3 vec3vv2(vv2); + Vec3 vec3vv3(vv3); + min->min(vec3vv1); + min->min(vec3vv2); + min->min(vec3vv3); + max->max(vec3vv1); + max->max(vec3vv2); + max->max(vec3vv3); + } // for igetNumTriangles + } + else if (const_cast(p)->isAKindOf(ssgTypeTransform())) + { + ssgBaseTransform* t=(ssgBaseTransform*)p; + + sgMat4 tmpT, tmpM; + t->getTransform(tmpT); + sgCopyMat4(tmpM, m); + sgPreMultMat4(tmpM,tmpT); + + for(ssgEntity* e=t->getKid(0); e!=NULL; e=t->getNextKid()) + { + MinMaxInternal(e, tmpM, min, max); + } // for i(p)->isAKindOf(ssgTypeBranch())) + { + ssgBranch* b =(ssgBranch*)p; + for(ssgEntity* e=b->getKid(0); e!=NULL; e=b->getNextKid()) + { + MinMaxInternal(e, m, min, max); + } // for i(p)->print(stdout, 0, 0); + } + } // MinMaxInternal + // ------------------------------------------------------------------------ + /** Computes the minimum and maximum x/y coordinates for a ssgEntity. + * + * Recursively computes the minimum x and y coordinates of a ssgEntity. + * \param p ssgEntity for which t compute the extend. + * \param min Minimum values in all three dimensions. + * \param max Maximum values in all three dimensions. + */ + void MinMax(const ssgEntity* p, Vec3 *min, Vec3 *max) + { + sgMat4 mat; + sgMakeIdentMat4(mat); + *min = Vec3(10000.0f); + *max = Vec3(-10000.0f); + MinMaxInternal(p, mat,min, max); + } // Minmax + +} // namespace SSGHelp +/* EOF */ diff --git a/src/ssg_help.hpp b/src/utils/ssg_help.hpp similarity index 57% rename from src/ssg_help.hpp rename to src/utils/ssg_help.hpp index 5fd8d0f1c..d5a0dcd62 100644 --- a/src/ssg_help.hpp +++ b/src/utils/ssg_help.hpp @@ -22,22 +22,17 @@ #define HEADER_SSG_HELP_H #include +#include "vec3.hpp" -//* Several useful functions which don't fit anywhere else -void createDisplayLists(ssgEntity *entity); -ssgTransform* add_transform (ssgBranch* branch); -void print_model (ssgEntity *entity, const int indent, - const int maxLevel); -void MinMax (ssgEntity *p, - float *x_min, float *x_max, - float *y_min, float *y_max, - float *z_min=NULL, float *z_max=NULL); -void MinMax (ssgEntity *p, sgMat4 m, - float *x_min, float *x_max, - float *y_min, float *y_max, - float *z_min=NULL, float *z_max=NULL); - - +namespace SSGHelp { + //* Several useful functions which don't fit anywhere else + void createDisplayLists(ssgEntity *entity); + ssgTransform* add_transform (ssgBranch* branch); + void print_model (ssgEntity *entity, const int indent, + const int maxLevel); + void MinMax (const ssgEntity *p, + Vec3 *min, Vec3 *max); +}; // namespace SSGHelp #endif /* EOF */ diff --git a/src/world.cpp b/src/world.cpp index 6b9c9a896..28bfbf521 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -93,7 +93,7 @@ World::World() } // Create the physics - m_physics = new Physics(m_track->getGravity()); + m_physics = new Physics(); assert(race_manager->getNumKarts() > 0); @@ -737,6 +737,9 @@ void World::updateRacePosition ( int k ) } // updateRacePosition //----------------------------------------------------------------------------- +/** Cleans up old herrings (from a previous race), removes old track specific + * herring models, and loads the actual track. + */ void World::loadTrack() { // remove old herrings (from previous race), and remove old