diff --git a/src/Makefile.am b/src/Makefile.am index 2d56146ef..22c77b0f5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -157,8 +157,6 @@ supertuxkart_SOURCES = \ highscores.hpp \ highscore_manager.cpp \ highscore_manager.hpp \ - loader.cpp \ - loader.hpp \ race_manager.cpp \ race_manager.hpp \ main_loop.cpp \ diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index a882b8654..f0a25e1f6 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -236,7 +236,7 @@ void IrrDriver::removeMesh(scene::IMesh *mesh) /** Adds an animated mesh to the scene. * \param mesh The animated mesh to add. */ -scene::ISceneNode *IrrDriver::addAnimatedMesh(scene::IAnimatedMesh *mesh) +scene::IAnimatedMeshSceneNode *IrrDriver::addAnimatedMesh(scene::IAnimatedMesh *mesh) { return m_scene_manager->addAnimatedMeshSceneNode(mesh); } // addAnimatedMesh @@ -318,6 +318,14 @@ void IrrDriver::setAmbientLight(const video::SColor &light) */ void IrrDriver::update(float dt) { + // FIXME: the run() call interferes with the SDL event handling + // currently implemented in STK (since run() converts all SDL events + // into irrlicht events). To avoid re-writing the STK event handling, + // instead of calling run(), we only update the irrlicht timer (which is + // necessary to get animations to work) - that's the only other operation + // happening in run. + //if(!m_device->run()) return; + m_device->getTimer()->tick(); m_device->getVideoDriver()->beginScene(true, true, video::SColor(255,100,101,140)); m_scene_manager->drawAll(); diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index a23d1fe22..54b3f7111 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -66,7 +66,8 @@ public: scene::ISceneNode *addSkyBox(const std::vector &texture_names); void removeNode(scene::ISceneNode *node); void removeMesh(scene::IMesh *mesh); - scene::ISceneNode *addAnimatedMesh(scene::IAnimatedMesh *mesh); + scene::IAnimatedMeshSceneNode + *addAnimatedMesh(scene::IAnimatedMesh *mesh); scene::ICameraSceneNode *addCamera(); void update(float dt); diff --git a/src/graphics/scene.cpp b/src/graphics/scene.cpp index fb0cf8d90..952409013 100644 --- a/src/graphics/scene.cpp +++ b/src/graphics/scene.cpp @@ -142,10 +142,6 @@ void Scene::draw(float dt) { // Use this for faster profiling by disabling drawing the scene graph //if(!user_config->m_profile)ssgCullAndDraw ( m_scenegraph ); -#ifdef HAVE_IRRLICHT -#else - ssgCullAndDraw ( m_scenegraph ); -#endif } #ifdef HAVE_GLUT else @@ -206,4 +202,3 @@ void Scene::draw(float dt) glViewport ( 0, 0, user_config->m_width, user_config->m_height ) ; } - diff --git a/src/ide/vc9/supertuxkart.vcproj b/src/ide/vc9/supertuxkart.vcproj index 07afdb1da..f15681ca3 100644 --- a/src/ide/vc9/supertuxkart.vcproj +++ b/src/ide/vc9/supertuxkart.vcproj @@ -221,10 +221,6 @@ RelativePath="../../../src\isect.cpp" > - - @@ -727,10 +723,6 @@ RelativePath="../../../src\isect.hpp" > - - diff --git a/src/items/attachment.cpp b/src/items/attachment.cpp index 2c9ba0583..cf89baa39 100644 --- a/src/items/attachment.cpp +++ b/src/items/attachment.cpp @@ -29,11 +29,11 @@ #include "network/network_manager.hpp" #include "utils/constants.hpp" -Attachment::Attachment(Kart* _kart) +Attachment::Attachment(Kart* kart) { m_type = ATTACH_NOTHING; m_time_left = 0.0; - m_kart = _kart; + m_kart = kart; m_previous_owner = NULL; m_node = NULL; diff --git a/src/items/flyable.cpp b/src/items/flyable.cpp index 95d248cc7..9abbd653b 100644 --- a/src/items/flyable.cpp +++ b/src/items/flyable.cpp @@ -187,7 +187,7 @@ void Flyable::getClosestKart(const Kart **minKart, float *minDistSquared, } // getClosestKart //----------------------------------------------------------------------------- -void Flyable::update (float dt) +void Flyable::update(float dt) { m_time_since_thrown += dt; if(m_max_lifespan > -1 && m_time_since_thrown > m_max_lifespan) hit(NULL); diff --git a/src/items/projectile_manager.cpp b/src/items/projectile_manager.cpp index b09a59e58..e3e8af422 100644 --- a/src/items/projectile_manager.cpp +++ b/src/items/projectile_manager.cpp @@ -17,17 +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 "network/network_manager.hpp" -#include "network/race_state.hpp" -#include "loader.hpp" #include "items/projectile_manager.hpp" + +#include "explosion.hpp" #include "items/bowling.hpp" #include "items/cake.hpp" #include "items/plunger.hpp" -#include "explosion.hpp" -#include "graphics/scene.hpp" #include "items/powerup_manager.hpp" #include "items/powerup.hpp" +#include "graphics/scene.hpp" +#include "network/network_manager.hpp" +#include "network/race_state.hpp" static ssgSelector *find_selector ( ssgBranch *b ); diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index 623e0a084..130f10f30 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -79,6 +79,7 @@ Kart::Kart (const std::string& kart_name, int position, m_smoke_system = NULL; m_nitro = NULL; m_skidmarks = NULL; + m_animated_node = NULL; m_view_blocked_by_plunger = 0; @@ -1010,7 +1011,12 @@ void Kart::loadData() { //float r [ 2 ] = { -10.0f, 100.0f } ; - m_kart_properties->getKartModel()->attachModel(&m_node); + m_kart_properties->getKartModel()->attachModel(&m_animated_node); + //m_kart_properties->getKartModel()->attachModel(&m_node); + m_animated_node->setLoopMode(true); + m_animated_node->setFrameLoop(1,14); + m_animated_node->setAnimationSpeed(15); + createPhysics(); // Attach Particle System diff --git a/src/karts/kart.hpp b/src/karts/kart.hpp index 5fb67332d..5e90ffe96 100644 --- a/src/karts/kart.hpp +++ b/src/karts/kart.hpp @@ -18,8 +18,8 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef HEADER_KART_H -#define HEADER_KART_H +#ifndef HEADER_KART_HPP +#define HEADER_KART_HPP #define _WINSOCKAPI_ #include diff --git a/src/karts/kart_model.cpp b/src/karts/kart_model.cpp index e2ed2f5b9..fde733733 100644 --- a/src/karts/kart_model.cpp +++ b/src/karts/kart_model.cpp @@ -76,9 +76,10 @@ KartModel::~KartModel() /** Attach the kart model and wheels to the scene node. * \param node Node to attach the models to. */ -void KartModel::attachModel(scene::ISceneNode **node) +void KartModel::attachModel(scene::IAnimatedMeshSceneNode **node) { - *node = irr_driver->addMesh(m_mesh); + *node = irr_driver->addAnimatedMesh(m_mesh); + for(unsigned int i=0; i<4; i++) { m_wheel_node[i] = irr_driver->addMesh(m_wheel_model[i]); @@ -94,7 +95,7 @@ void KartModel::loadModels(const std::string &kart_ident) { std::string full_path = file_manager->getKartFile(m_model_filename, kart_ident); - m_mesh = irr_driver->getMesh(full_path); + m_mesh = irr_driver->getAnimatedMesh(full_path); Vec3 min, max; MeshTools::minMax3D(m_mesh, &min, &max); Vec3 size = max-min; diff --git a/src/karts/kart_model.hpp b/src/karts/kart_model.hpp index 404837125..097b5f807 100644 --- a/src/karts/kart_model.hpp +++ b/src/karts/kart_model.hpp @@ -22,13 +22,8 @@ #include -#define _WINSOCKAPI_ -#ifdef HAVE_IRRLICHT #include "irrlicht.h" using namespace irr; -#else -#include -#endif #include "no_copy.hpp" #include "lisp/lisp.hpp" @@ -42,13 +37,8 @@ using namespace irr; class KartModel { private: -#ifdef HAVE_IRRLICHT /** The mesh of the model. */ - scene::IMesh *m_mesh; -#else - /** The transform node/root of the kart model. */ - ssgTransform *m_root; -#endif + scene::IAnimatedMesh *m_mesh; /** Value used to indicate undefined entries. */ static float UNDEFINED; @@ -56,16 +46,11 @@ private: /** Name of the 3d model file. */ std::string m_model_filename; -#ifdef HAVE_IRRLICHT /** The four wheel models. */ scene::IMesh *m_wheel_model[4]; /** The four scene nodes the wheels are attached to */ scene::ISceneNode *m_wheel_node[4]; -#else - /** The four wheel models. */ - ssgEntity *m_wheel_model[4]; -#endif /** Filename of the wheel models. */ std::string m_wheel_filename[4]; @@ -92,14 +77,8 @@ private: of wheels in bullet is too large and looks strange). 1=no change, 2=half the amplitude */ float m_dampen_suspension_amplitude[4]; -#ifdef HAVE_IRRLICHT /** The transform for the wheels, used to rotate the wheels and display * the suspension in the race. */ -#else - /** The transform for the wheels, used to rotate the wheels and display - * the suspension in the race. */ - ssgTransform *m_wheel_transform[4]; -#endif float m_kart_width; /**< Width of kart. */ float m_kart_length; /**< Length of kart. */ @@ -115,12 +94,8 @@ public: ~KartModel(); void loadInfo(const lisp::Lisp* lisp); void loadModels(const std::string &kart_ident); -#ifdef HAVE_IRRLICHT - void attachModel(scene::ISceneNode **node); - scene::IMesh* getModel() const { return m_mesh; } -#else - ssgTransform *getRoot() const { return m_root; } -#endif + void attachModel(scene::IAnimatedMeshSceneNode **node); + scene::IAnimatedMesh* getModel() const { return m_mesh; } /** Returns the position of a wheel relative to the kart. * \param i Index of the wheel: 0=front right, 1 = front left, 2 = rear diff --git a/src/karts/moveable.cpp b/src/karts/moveable.cpp index ecae98eb3..48cba2d0c 100644 --- a/src/karts/moveable.cpp +++ b/src/karts/moveable.cpp @@ -35,6 +35,7 @@ Moveable::Moveable() m_mesh = NULL; m_animated_mesh = NULL; m_node = NULL; + m_animated_node = NULL; } // Moveable //----------------------------------------------------------------------------- @@ -44,19 +45,50 @@ Moveable::~Moveable() if(m_body) delete m_body; if(m_motion_state) delete m_motion_state; if(m_node) irr_driver->removeNode(m_node); + if(m_animated_node) irr_driver->removeNode(m_animated_node); if(m_mesh) irr_driver->removeMesh(m_mesh); if(m_animated_mesh) irr_driver->removeMesh(m_animated_mesh); // FIXME LEAK: what about model? ssgDeRefDelete(m_model_transform) } // ~Moveable +//----------------------------------------------------------------------------- +/** Sets this model to be non-animated. + * \param n The scene node. + */ +void Moveable::setNode(scene::ISceneNode *n) +{ + m_node = n; + m_animated_node = NULL; +} // setNode + +//----------------------------------------------------------------------------- +/** Sets this model to be animated. + * \param n The animated scene node. + */ +void Moveable::setAnimatedNode(scene::IAnimatedMeshSceneNode *n) +{ + m_node = NULL; + m_animated_node = n; +} // setAnimatedNode + //----------------------------------------------------------------------------- void Moveable::updateGraphics(const Vec3& off_xyz, const Vec3& off_hpr) { Vec3 xyz=getXYZ()+off_xyz; Vec3 hpr=getHPR()+off_hpr; sgCoord c=Coord(xyz, hpr).toSgCoord(); - m_node->setPosition(xyz.toIrrVector()); - m_node->setRotation(hpr.toIrrHPR()); + printf("x %f y %f offx %f offy %f\n", + xyz.x(), xyz.y(), off_xyz.x(), off_xyz.y()); + if(m_node) + { + m_node->setPosition(xyz.toIrrVector()); + m_node->setRotation(hpr.toIrrHPR()); + } + else if(m_animated_node) + { + m_animated_node->setPosition(xyz.toIrrVector()); + m_animated_node->setRotation(hpr.toIrrHPR()); + } } // updateGraphics //----------------------------------------------------------------------------- diff --git a/src/karts/moveable.hpp b/src/karts/moveable.hpp index c041b62f9..bcff4af90 100644 --- a/src/karts/moveable.hpp +++ b/src/karts/moveable.hpp @@ -49,6 +49,8 @@ protected: scene::IAnimatedMesh *m_animated_mesh; scene::IMesh *m_mesh; scene::ISceneNode *m_node; + scene::IAnimatedMeshSceneNode + *m_animated_node; int m_first_time ; btRigidBody *m_body; KartMotionState *m_motion_state; @@ -57,8 +59,9 @@ public: Moveable(); virtual ~Moveable(); scene::ISceneNode - *getNode() {return m_node; } - void setNode(scene::ISceneNode *n){m_node = n; } + *getNode() { return m_node ? m_node : m_animated_node; } + void setNode(scene::ISceneNode *n); + void setAnimatedNode(scene::IAnimatedMeshSceneNode *n); virtual const btVector3 &getVelocity() const {return m_body->getLinearVelocity();} const btVector3 diff --git a/src/loader.cpp b/src/loader.cpp deleted file mode 100644 index c5cb14a33..000000000 --- a/src/loader.cpp +++ /dev/null @@ -1,222 +0,0 @@ -// $Id: loader.cpp 1610 2008-03-01 03:18:53Z hikerstk $ -// -// SuperTuxKart - a fun racing game with go-kart -// Copyright (C) 2004 Steve Baker -// (C) 2008 Steve Baker, Joerg Henrichs -// -// 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 -#include -#ifdef WIN32 -# include -# include -# ifndef __CYGWIN__ -# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) - // Some portabilty defines -# endif -#endif - -#include "loader.hpp" -#include "material_manager.hpp" -#include "material.hpp" -#include "graphics/moving_texture.hpp" -#include "io/file_manager.hpp" -#include "physics/physical_object.hpp" - -Loader* loader = 0; - -Loader::Loader() -{ -} // Loader - -//----------------------------------------------------------------------------- -Loader::~Loader() -{ -} // ~Loader - -//----------------------------------------------------------------------------- -void Loader::makeModelPath(char* path, const char* FNAME) const -{ - if(m_is_full_path) - { - strcpy(path, FNAME); - return; - } - - std::string p=file_manager->getModelFile(FNAME); - strcpy(path, p.c_str()); - return; -} // makeModelPath - -//----------------------------------------------------------------------------- -/** Loads a .ac model - * - * Loads the .ac model 'filename'. Callbacks contained in this file - * are stored in the callback class t. If optimise is set to false, - * the file will not be flattened, which is necessary for the kart - * models - flattening them will remove the wheel nodes, withouth - * which the wheels do not rotate. - * - * \param filename File to load - * - * \param t Callback category for callbacks included in this - * file (see callback_manager.hpp) - * - * \param optimise Default is true. If set to false, the model will not - * be flattened. - */ -ssgEntity *Loader::load(const std::string& filename, - bool optimise, bool is_full_path) -{ - m_is_full_path = is_full_path; - // FIXME: for now - return NULL; -} // load - -//----------------------------------------------------------------------------- -#ifndef HAVE_IRRLICHT -void Loader::preProcessObj ( ssgEntity *n, bool mirror ) -{ - if ( n == NULL ) return ; - - n -> dirtyBSphere () ; - - if ( n -> isAKindOf ( ssgTypeLeaf() ) ) - { - if ( mirror ) - for ( int i = 0 ; i < ((ssgLeaf *)n) -> getNumVertices () ; i++ ) - ((ssgLeaf *)n) -> getVertex ( i ) [ 0 ] *= -1.0f ; - - material_manager->getMaterial((ssgLeaf *) n ) -> applyToLeaf ( (ssgLeaf *) n ) ; - return ; - } - - if ( mirror && n -> isAKindOf ( ssgTypeTransform () ) ) - { - sgMat4 xform ; - - ((ssgTransform *)n) -> getTransform ( xform ) ; - xform [ 0 ][ 0 ] *= -1.0f ; - xform [ 1 ][ 0 ] *= -1.0f ; - xform [ 2 ][ 0 ] *= -1.0f ; - xform [ 3 ][ 0 ] *= -1.0f ; - ((ssgTransform *)n) -> setTransform ( xform ) ; - } - - ssgBranch *b = (ssgBranch *) n ; - - for ( int i = 0 ; i < b -> getNumKids () ; i++ ) - preProcessObj ( b -> getKid ( i ), mirror ) ; -} -#endif -//----------------------------------------------------------------------------- -#ifndef HAVE_IRRLICHT -ssgBranch *Loader::animInit (char *data ) const -{ - while ( ! isdigit ( *data ) && *data != '\0' ) - data++ ; - - const int START_LIM = strtol(data, &data, 0 ); - const int END_LIM = strtol(data, &data, 0 ); - const float TIME_LIM = (float)strtod(data, &data ); - - while ( *data <= ' ' && *data != '\0' ) - data++ ; - - char mode = toupper ( *data ) ; - - ssgTimedSelector *br = new ssgTimedSelector; - - br->setLimits (START_LIM+1, END_LIM+1 ) ; - br->setDuration(TIME_LIM ) ; - br->setMode ((mode=='O') ? SSG_ANIM_ONESHOT - : (mode=='S') ? SSG_ANIM_SWING - : SSG_ANIM_SHUTTLE ) ; - br->control (SSG_ANIM_START ) ; - - return br; -} // animInit - -#endif -//----------------------------------------------------------------------------- -#ifndef HAVE_IRRLICHT -/** Handle userdata that is stored in the model files. Mostly the userdata - * indicates that a special branch is to be created (e.g. a ssgCutout instead - * of the standard branch). But some userdata indicate that callbacks need - * to be created, which are then handled by the callback manager. - */ - -ssgBranch *Loader::createBranch(char *data) const -{ - - if ( data == NULL || data[0] != '@' ) return NULL; - - data++ ; /* Skip the '@' */ - - if ( strncmp("billboard", data, strlen("billboard") ) == 0 ) - return new ssgCutout(); - - if ( strncmp("DONT_DELETE", data, strlen("DONT_DELETE") ) == 0 ) - { - printf("DONT\n"); - ssgBranch *br = new ssgTransform(); - br->setUserData(new ssgBase()); - return br; - } - - if ( strncmp("invisible", data, strlen("invisible") ) == 0 ) - return new ssgInvisible(); - - if ( strncmp ( "switch", data, strlen ( "switch" ) ) == 0 ) - { - ssgSelector *sel = new ssgSelector(); - sel->select(0); - return sel; - } - - if ( strncmp ( "animate", data, strlen ( "animate" ) ) == 0 ) - return animInit(data); - - - if ( strncmp ( "autodcs", data, strlen ( "autodcs" ) ) == 0 ) - { - ssgTransform *br = new ssgTransform(); - Callback *c = new MovingTexture(data, br); - br->setUserData(new ssgBase()); - callback_manager->addCallback(c, m_current_callback_type); - return br; - } - - if ( strncmp ( "autotex", data, strlen ( "autotex" ) ) == 0 ) - { - ssgTexTrans *br = new ssgTexTrans(); - Callback *c = new MovingTexture(data, br); - callback_manager->addCallback(c, m_current_callback_type); - return br; - } - if(strncmp("physics", data, strlen("physics")) == 0) - { - MovingPhysics *mp = new MovingPhysics(std::string(data)); - callback_manager->addCallback(mp, m_current_callback_type); - return mp; - } - fprintf(stderr, "Warning: Ignoring userdata '%s'\n", data); - return NULL ; -} // createBranch -#endif diff --git a/src/loader.hpp b/src/loader.hpp deleted file mode 100644 index df82bc72a..000000000 --- a/src/loader.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// $Id: loader.hpp 1610 2008-03-01 03:18:53Z hikerstk $ -// -// SuperTuxKart - a fun racing game with go-kart -// Copyright (C) 2004 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. - -#ifndef HEADER_LOADER_HPP -#define HEADER_LOADER_HPP - -#define _WINSOCKAPI_ -#include -#include -#include -#include - -class Loader : public ssgLoaderOptions -{ -private: - bool m_is_full_path; - std::string m_root_dir; - std::vector m_texture_search_path, - m_model_search_path, - m_music_search_path; - bool findFile (std::string& full_path, - const std::string& fname, - const std::vector& search_path) const; -public: - Loader(); - ~Loader(); - - virtual void makeModelPath (char* path, const char* fname) const; - ssgEntity *load(const std::string& filename, bool optimise=true, - bool is_full_path=false); -private: - - void makePath (std::string& path, const std::string& dir, - const std::string& fname) const; -}; - -extern Loader* loader; - -#endif -