Added more textures (by putting them for now in the same directory as the
model), fixed detection of terrain (e.g. triggering rescue when trying to drive on water). git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3245 178a84e3-b1eb-0310-8ba1-8eac791a3b58
BIN
data/items/banana.b3d
Executable file
BIN
data/items/banana.png
Normal file
After Width: | Height: | Size: 55 KiB |
@ -9,7 +9,7 @@ OBJECT poly
|
|||||||
name "GiftBox_0"
|
name "GiftBox_0"
|
||||||
data 7
|
data 7
|
||||||
GiftBox
|
GiftBox
|
||||||
texture "gift-loop.rgb"
|
texture "gift-loop.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 158
|
numvert 158
|
||||||
@ -1188,7 +1188,7 @@ OBJECT poly
|
|||||||
name "GiftBox_1"
|
name "GiftBox_1"
|
||||||
data 7
|
data 7
|
||||||
GiftBox
|
GiftBox
|
||||||
texture "gift-box.rgb"
|
texture "gift-box.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 28
|
numvert 28
|
||||||
|
BIN
data/items/gift-box.b3d
Executable file
BIN
data/items/gift-box.png
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
data/items/gift-loop.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
data/items/nitro-tank.png
Normal file
After Width: | Height: | Size: 30 KiB |
@ -9,7 +9,7 @@ OBJECT poly
|
|||||||
name "BigTank_0"
|
name "BigTank_0"
|
||||||
data 7
|
data 7
|
||||||
BigTank
|
BigTank
|
||||||
texture "tank-blue.rgb"
|
texture "tank-blue.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 37
|
numvert 37
|
||||||
@ -434,7 +434,7 @@ OBJECT poly
|
|||||||
name "BigTank_1"
|
name "BigTank_1"
|
||||||
data 7
|
data 7
|
||||||
BigTank
|
BigTank
|
||||||
texture "nitro-tank.rgb"
|
texture "nitro-tank.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 67
|
numvert 67
|
||||||
@ -999,7 +999,7 @@ OBJECT poly
|
|||||||
name "BigTank_2"
|
name "BigTank_2"
|
||||||
data 7
|
data 7
|
||||||
BigTank
|
BigTank
|
||||||
texture "tank-green.rgb"
|
texture "tank-green.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 46
|
numvert 46
|
||||||
|
BIN
data/items/nitrotank-big.b3d
Executable file
@ -9,7 +9,7 @@ OBJECT poly
|
|||||||
name "SmallTank_0"
|
name "SmallTank_0"
|
||||||
data 9
|
data 9
|
||||||
SmallTank
|
SmallTank
|
||||||
texture "nitro-tank.rgb"
|
texture "nitro-tank.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 59
|
numvert 59
|
||||||
@ -558,7 +558,7 @@ OBJECT poly
|
|||||||
name "SmallTank_1"
|
name "SmallTank_1"
|
||||||
data 9
|
data 9
|
||||||
SmallTank
|
SmallTank
|
||||||
texture "tank-cyan.rgb"
|
texture "tank-cyan.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 46
|
numvert 46
|
||||||
@ -1100,7 +1100,7 @@ OBJECT poly
|
|||||||
name "SmallTank_2"
|
name "SmallTank_2"
|
||||||
data 9
|
data 9
|
||||||
SmallTank
|
SmallTank
|
||||||
texture "tank-blue.rgb"
|
texture "tank-blue.png"
|
||||||
texrep 1 1
|
texrep 1 1
|
||||||
crease 70.000000
|
crease 70.000000
|
||||||
numvert 37
|
numvert 37
|
||||||
|
BIN
data/items/nitrotank-small.b3d
Executable file
BIN
data/items/tank-blue.png
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
data/items/tank-cyan.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
data/items/tank-green.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
data/models/bowling.b3d
Executable file
BIN
data/models/bowling.png
Normal file
After Width: | Height: | Size: 20 KiB |
@ -17,21 +17,17 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include <plib/ssg.h>
|
|
||||||
#include "explosion.hpp"
|
#include "explosion.hpp"
|
||||||
|
|
||||||
#include "items/projectile_manager.hpp"
|
#include "items/projectile_manager.hpp"
|
||||||
#include "audio/sfx_base.hpp"
|
#include "audio/sfx_base.hpp"
|
||||||
#include "audio/sfx_manager.hpp"
|
#include "audio/sfx_manager.hpp"
|
||||||
#include "graphics/scene.hpp"
|
#include "graphics/scene.hpp"
|
||||||
#include "utils/vec3.hpp"
|
#include "utils/vec3.hpp"
|
||||||
|
|
||||||
Explosion::Explosion(const Vec3& coord, const int explosion_sound) : ssgTransform()
|
Explosion::Explosion(const Vec3& coord, const int explosion_sound)
|
||||||
{
|
{
|
||||||
this->ref();
|
m_mesh = projectile_manager->getExplosionModel();
|
||||||
ssgCutout *cut = new ssgCutout();
|
|
||||||
addKid(cut); // derefing the explosion will free the cutout
|
|
||||||
m_seq = projectile_manager->getExplosionModel();
|
|
||||||
cut->addKid(m_seq);
|
|
||||||
m_explode_sound = sfx_manager->newSFX( (SFXManager::SFXType)explosion_sound );
|
m_explode_sound = sfx_manager->newSFX( (SFXManager::SFXType)explosion_sound );
|
||||||
init(coord);
|
init(coord);
|
||||||
} // Explosion
|
} // Explosion
|
||||||
@ -54,15 +50,16 @@ void Explosion::init(const Vec3& coord)
|
|||||||
sgCoord c;
|
sgCoord c;
|
||||||
c.xyz[0]=coord[0];c.xyz[1]=coord[1];c.xyz[2]=coord[2];
|
c.xyz[0]=coord[0];c.xyz[1]=coord[1];c.xyz[2]=coord[2];
|
||||||
c.hpr[0]=0; c.hpr[1]=0; c.hpr[2]=0;
|
c.hpr[0]=0; c.hpr[1]=0; c.hpr[2]=0;
|
||||||
setTransform(&c);
|
//setTransform(&c);
|
||||||
m_step = -1;
|
m_step = -1;
|
||||||
stk_scene->add(this);
|
//stk_scene->add(this);
|
||||||
m_has_ended = false;
|
m_has_ended = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void Explosion::update(float dt)
|
void Explosion::update(float dt)
|
||||||
{
|
{
|
||||||
|
#ifndef HAVE_IRRLICHT
|
||||||
//fprintf(stderr, "Explosion: update: ");
|
//fprintf(stderr, "Explosion: update: ");
|
||||||
if(++m_step >= m_seq->getNumKids())
|
if(++m_step >= m_seq->getNumKids())
|
||||||
{
|
{
|
||||||
@ -85,4 +82,5 @@ void Explosion::update(float dt)
|
|||||||
//fprintf(stderr, "Step.\n");
|
//fprintf(stderr, "Step.\n");
|
||||||
m_seq->selectStep(m_step);
|
m_seq->selectStep(m_step);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -17,23 +17,30 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#ifndef HEADER_EXPLOSION_H
|
#ifndef HEADER_EXPLOSION_HPP
|
||||||
#define HEADER_EXPLOSION_H
|
#define HEADER_EXPLOSION_HPP
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
class Vec3;
|
class Vec3;
|
||||||
class SFXBase;
|
class SFXBase;
|
||||||
|
namespace irr
|
||||||
|
{
|
||||||
|
namespace scene
|
||||||
|
{
|
||||||
|
class IMesh;
|
||||||
|
class ISceneNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Explosion : public ssgTransform
|
class Explosion
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
SFXBase* m_explode_sound;
|
SFXBase* m_explode_sound;
|
||||||
bool m_has_ended;
|
bool m_has_ended;
|
||||||
|
irr::scene::IMesh *m_mesh;
|
||||||
|
irr::scene::ISceneNode *m_node;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int m_step ;
|
int m_step ;
|
||||||
ssgSelector *m_seq ;
|
|
||||||
|
|
||||||
Explosion(const Vec3& coord, const int explosion_sound);
|
Explosion(const Vec3& coord, const int explosion_sound);
|
||||||
~Explosion();
|
~Explosion();
|
||||||
|
@ -196,6 +196,7 @@ FileManager::~FileManager()
|
|||||||
XMLReader *FileManager::getXMLReader(const std::string &f)
|
XMLReader *FileManager::getXMLReader(const std::string &f)
|
||||||
{
|
{
|
||||||
io::IXMLReader *r = m_file_system->createXMLReader(f.c_str());
|
io::IXMLReader *r = m_file_system->createXMLReader(f.c_str());
|
||||||
|
if(!r) return NULL;
|
||||||
return new XMLReader(r);
|
return new XMLReader(r);
|
||||||
} // getXMLReader
|
} // getXMLReader
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ int XMLNode::get(const std::string &attribute, bool *value) const
|
|||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
if(!get(attribute, &s)) return 0;
|
if(!get(attribute, &s)) return 0;
|
||||||
*value = s=="" || s[0]=='T' || s[0]=='t' ||
|
*value = s=="" || s[0]=='T' || s[0]=='t' || s[0]=='Y' || s[0]=='y' ||
|
||||||
s=="true" || s=="TRUE" || s=="#t" || s=="#T";
|
s=="true" || s=="TRUE" || s=="#t" || s=="#T";
|
||||||
return 1;
|
return 1;
|
||||||
} // get(bool)
|
} // get(bool)
|
||||||
|
@ -73,26 +73,21 @@ Shadow::Shadow ( float x1, float x2, float y1, float y2 )
|
|||||||
ssgVtxTable *gs = new ssgVtxTable ( GL_TRIANGLE_STRIP, va, na, ta, ca ) ;
|
ssgVtxTable *gs = new ssgVtxTable ( GL_TRIANGLE_STRIP, va, na, ta, ca ) ;
|
||||||
|
|
||||||
gs -> clrTraversalMaskBits ( SSGTRAV_ISECT|SSGTRAV_HOT ) ;
|
gs -> clrTraversalMaskBits ( SSGTRAV_ISECT|SSGTRAV_HOT ) ;
|
||||||
|
#ifndef HAVE_IRRLICHT
|
||||||
gs -> setState ( fuzzy_gst ) ;
|
gs -> setState ( fuzzy_gst ) ;
|
||||||
|
#endif
|
||||||
sh -> addKid ( gs ) ;
|
sh -> addKid ( gs ) ;
|
||||||
sh -> ref () ; /* Make sure it doesn't get deleted by mistake */
|
sh -> ref () ; /* Make sure it doesn't get deleted by mistake */
|
||||||
} // Shadow
|
} // Shadow
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
ItemManager* item_manager;
|
ItemManager* item_manager;
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
typedef std::map<std::string,scene::IMesh*>::const_iterator CI_type;
|
typedef std::map<std::string,scene::IMesh*>::const_iterator CI_type;
|
||||||
#else
|
|
||||||
typedef std::map<std::string,ssgEntity*>::const_iterator CI_type;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ItemManager::ItemManager()
|
ItemManager::ItemManager()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
m_all_meshes.clear();
|
m_all_meshes.clear();
|
||||||
#else
|
|
||||||
m_all_models.clear();
|
|
||||||
#endif
|
|
||||||
// The actual loading is done in loadDefaultItems
|
// The actual loading is done in loadDefaultItems
|
||||||
} // ItemManager
|
} // ItemManager
|
||||||
|
|
||||||
@ -106,26 +101,17 @@ void ItemManager::removeTextures()
|
|||||||
}
|
}
|
||||||
m_all_items.clear();
|
m_all_items.clear();
|
||||||
|
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
||||||
{
|
{
|
||||||
i->second->drop();
|
i->second->drop();
|
||||||
}
|
}
|
||||||
m_all_meshes.clear();
|
m_all_meshes.clear();
|
||||||
#else
|
|
||||||
for(CI_type i=m_all_models.begin(); i!=m_all_models.end(); ++i)
|
|
||||||
{
|
|
||||||
i->second->deRef();
|
|
||||||
}
|
|
||||||
m_all_models.clear();
|
|
||||||
#endif
|
|
||||||
callback_manager->clear(CB_ITEM);
|
callback_manager->clear(CB_ITEM);
|
||||||
} // removeTextures
|
} // removeTextures
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
ItemManager::~ItemManager()
|
ItemManager::~ItemManager()
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
||||||
{
|
{
|
||||||
// FIXME: What about this plib comment:
|
// FIXME: What about this plib comment:
|
||||||
@ -135,16 +121,6 @@ ItemManager::~ItemManager()
|
|||||||
i->second->drop();
|
i->second->drop();
|
||||||
}
|
}
|
||||||
m_all_meshes.clear();
|
m_all_meshes.clear();
|
||||||
#else
|
|
||||||
for(CI_type i=m_all_models.begin(); i!=m_all_models.end(); ++i)
|
|
||||||
{
|
|
||||||
// We can't use ssgDeRefDelete here, since then the object would be
|
|
||||||
// freed, and when m_all_models is deleted, we have invalid memory
|
|
||||||
// accesses.
|
|
||||||
i->second->deRef();
|
|
||||||
}
|
|
||||||
m_all_models.clear();
|
|
||||||
#endif
|
|
||||||
} // ~ItemManager
|
} // ~ItemManager
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -160,7 +136,6 @@ void ItemManager::loadDefaultItems()
|
|||||||
for(std::set<std::string>::iterator i = files.begin();
|
for(std::set<std::string>::iterator i = files.begin();
|
||||||
i != files.end(); ++i)
|
i != files.end(); ++i)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
// FIXME: We should try to check the extension,
|
// FIXME: We should try to check the extension,
|
||||||
// i.e. load only .3ds files
|
// i.e. load only .3ds files
|
||||||
scene::IMesh *mesh = irr_driver->getAnimatedMesh(*i);
|
scene::IMesh *mesh = irr_driver->getAnimatedMesh(*i);
|
||||||
@ -168,16 +143,6 @@ void ItemManager::loadDefaultItems()
|
|||||||
std::string shortName = StringUtils::basename(StringUtils::without_extension(*i));
|
std::string shortName = StringUtils::basename(StringUtils::without_extension(*i));
|
||||||
m_all_meshes[shortName] = mesh;
|
m_all_meshes[shortName] = mesh;
|
||||||
mesh->grab();
|
mesh->grab();
|
||||||
#else
|
|
||||||
if(!StringUtils::has_suffix(*i, ".ac")) continue;
|
|
||||||
ssgEntity* h = loader->load(*i, CB_ITEM,
|
|
||||||
/*optimise*/true,
|
|
||||||
/*full_path*/true);
|
|
||||||
std::string shortName = StringUtils::basename(StringUtils::without_extension(*i));
|
|
||||||
h->ref();
|
|
||||||
h->setName(shortName.c_str());
|
|
||||||
m_all_models[shortName] = h;
|
|
||||||
#endif
|
|
||||||
} // for i
|
} // for i
|
||||||
|
|
||||||
setDefaultItemStyle();
|
setDefaultItemStyle();
|
||||||
@ -198,13 +163,8 @@ void ItemManager::setDefaultItemStyle()
|
|||||||
std::ostringstream msg;
|
std::ostringstream msg;
|
||||||
for(int i=Item::ITEM_FIRST; i<=Item::ITEM_LAST; i++)
|
for(int i=Item::ITEM_FIRST; i<=Item::ITEM_LAST; i++)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
m_item_mesh[i] = m_all_meshes[DEFAULT_NAMES[i]];
|
m_item_mesh[i] = m_all_meshes[DEFAULT_NAMES[i]];
|
||||||
if(!m_item_mesh[i])
|
if(!m_item_mesh[i])
|
||||||
#else
|
|
||||||
m_item_model[i] = m_all_models[DEFAULT_NAMES[i]];
|
|
||||||
if(!m_item_model[i])
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
msg << "Item model '" << DEFAULT_NAMES[i]
|
msg << "Item model '" << DEFAULT_NAMES[i]
|
||||||
<< "' is missing (see item_manager)!\n";
|
<< "' is missing (see item_manager)!\n";
|
||||||
@ -215,11 +175,7 @@ void ItemManager::setDefaultItemStyle()
|
|||||||
if(bError)
|
if(bError)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "The following models are available:\n");
|
fprintf(stderr, "The following models are available:\n");
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
for(CI_type i=m_all_meshes.begin(); i!=m_all_meshes.end(); ++i)
|
||||||
#else
|
|
||||||
for(CI_type i=m_all_models.begin(); i!=m_all_models.end(); ++i)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
if(i->second)
|
if(i->second)
|
||||||
{
|
{
|
||||||
@ -242,21 +198,12 @@ Item* ItemManager::newItem(Item::ItemType type, const Vec3& xyz,
|
|||||||
const Vec3 &normal, Kart *parent)
|
const Vec3 &normal, Kart *parent)
|
||||||
{
|
{
|
||||||
Item* h;
|
Item* h;
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
if(type == Item::ITEM_BUBBLEGUM)
|
if(type == Item::ITEM_BUBBLEGUM)
|
||||||
h = new BubbleGumItem(type, xyz, normal, m_item_mesh[type],
|
h = new BubbleGumItem(type, xyz, normal, m_item_mesh[type],
|
||||||
m_all_items.size());
|
m_all_items.size());
|
||||||
else
|
else
|
||||||
h = new Item(type, xyz, normal, m_item_mesh[type],
|
h = new Item(type, xyz, normal, m_item_mesh[type],
|
||||||
m_all_items.size());
|
m_all_items.size());
|
||||||
#else
|
|
||||||
if(type == Item::ITEM_BUBBLEGUM)
|
|
||||||
h = new BubbleGumItem(type, xyz, normal, m_item_model[type],
|
|
||||||
m_all_items.size());
|
|
||||||
else
|
|
||||||
h = new Item(type, xyz, normal, m_item_model[type],
|
|
||||||
m_all_items.size());
|
|
||||||
#endif
|
|
||||||
if(parent != NULL) h->setParent(parent);
|
if(parent != NULL) h->setParent(parent);
|
||||||
|
|
||||||
m_all_items.push_back(h);
|
m_all_items.push_back(h);
|
||||||
@ -409,10 +356,6 @@ void ItemManager::setItem(const lisp::Lisp *item_node,
|
|||||||
item_node->get(colour, name);
|
item_node->get(colour, name);
|
||||||
if(name.size()>0)
|
if(name.size()>0)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
m_item_mesh[type]=m_all_meshes[name];
|
m_item_mesh[type]=m_all_meshes[name];
|
||||||
#else
|
|
||||||
m_item_model[type]=m_all_models[name];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} // setItem
|
} // setItem
|
||||||
|
@ -42,7 +42,6 @@ initPowerupType;
|
|||||||
|
|
||||||
initPowerupType ict[]=
|
initPowerupType ict[]=
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
{POWERUP_ZIPPER, "zipper.collectable" },
|
{POWERUP_ZIPPER, "zipper.collectable" },
|
||||||
{POWERUP_BOWLING, "bowling.projectile" },
|
{POWERUP_BOWLING, "bowling.projectile" },
|
||||||
{POWERUP_BUBBLEGUM, "bubblegum.xml" },
|
{POWERUP_BUBBLEGUM, "bubblegum.xml" },
|
||||||
@ -51,16 +50,6 @@ initPowerupType ict[]=
|
|||||||
{POWERUP_PARACHUTE, "parachute.collectable" },
|
{POWERUP_PARACHUTE, "parachute.collectable" },
|
||||||
{POWERUP_PLUNGER, "plunger.projectile" },
|
{POWERUP_PLUNGER, "plunger.projectile" },
|
||||||
{POWERUP_MAX, "" },
|
{POWERUP_MAX, "" },
|
||||||
#else
|
|
||||||
{POWERUP_ZIPPER, "zipper.collectable" },
|
|
||||||
{POWERUP_BOWLING, "bowling.projectile" },
|
|
||||||
{POWERUP_BUBBLEGUM, "bubblegum.projectile" },
|
|
||||||
{POWERUP_CAKE, "cake.projectile" },
|
|
||||||
{POWERUP_ANVIL, "anvil.collectable" },
|
|
||||||
{POWERUP_PARACHUTE, "parachute.collectable" },
|
|
||||||
{POWERUP_PLUNGER, "plunger.projectile" },
|
|
||||||
{POWERUP_MAX, "" },
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
PowerupManager* powerup_manager=0;
|
PowerupManager* powerup_manager=0;
|
||||||
@ -70,11 +59,7 @@ PowerupManager::PowerupManager()
|
|||||||
{
|
{
|
||||||
for(int i=0; i<POWERUP_MAX; i++)
|
for(int i=0; i<POWERUP_MAX; i++)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
m_all_meshes[i] = NULL;
|
m_all_meshes[i] = NULL;
|
||||||
#else
|
|
||||||
m_all_models[i] = (ssgEntity*)NULL;
|
|
||||||
#endif
|
|
||||||
m_all_icons[i] = (Material*)NULL;
|
m_all_icons[i] = (Material*)NULL;
|
||||||
}
|
}
|
||||||
} // PowerupManager
|
} // PowerupManager
|
||||||
@ -130,17 +115,12 @@ void PowerupManager::LoadNode(const lisp::Lisp* lisp, int collectType )
|
|||||||
{
|
{
|
||||||
std::string sName, sModel, sIconFile;
|
std::string sName, sModel, sIconFile;
|
||||||
lisp->get("name", sName );
|
lisp->get("name", sName );
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
lisp->get("mesh", sModel );
|
lisp->get("mesh", sModel );
|
||||||
#else
|
|
||||||
lisp->get("model", sModel );
|
|
||||||
#endif
|
|
||||||
lisp->get("icon", sIconFile );
|
lisp->get("icon", sIconFile );
|
||||||
// load material
|
// load material
|
||||||
m_all_icons[collectType] = material_manager->getMaterial(sIconFile,
|
m_all_icons[collectType] = material_manager->getMaterial(sIconFile,
|
||||||
/* full_path */ false,
|
/* full_path */ false,
|
||||||
/*make_permanent */ true);
|
/*make_permanent */ true);
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
if(sModel!="")
|
if(sModel!="")
|
||||||
{
|
{
|
||||||
// FIXME LEAK: not freed (unimportant, since the models have to exist
|
// FIXME LEAK: not freed (unimportant, since the models have to exist
|
||||||
@ -153,27 +133,8 @@ void PowerupManager::LoadNode(const lisp::Lisp* lisp, int collectType )
|
|||||||
m_all_meshes[collectType] = 0;
|
m_all_meshes[collectType] = 0;
|
||||||
m_all_extends[collectType] = btVector3(0.0f,0.0f,0.0f);
|
m_all_extends[collectType] = btVector3(0.0f,0.0f,0.0f);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
m_all_icons[collectType]->getState()->ref();
|
|
||||||
|
|
||||||
if(sModel!="")
|
|
||||||
{
|
|
||||||
// FIXME LEAK: not freed (unimportant, since the models have to exist
|
|
||||||
// for the whole game anyway).
|
|
||||||
ssgEntity* e = loader->load(sModel, CB_COLLECTABLE);
|
|
||||||
m_all_models[collectType] = e;
|
|
||||||
e->ref();
|
|
||||||
e->clrTraversalMaskBits(SSGTRAV_ISECT|SSGTRAV_HOT);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_all_models[collectType] = 0;
|
|
||||||
m_all_extends[collectType] = btVector3(0.0f,0.0f,0.0f);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Load special attributes for certain powerups
|
// Load special attributes for certain powerups
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
switch (collectType) {
|
switch (collectType) {
|
||||||
case POWERUP_BOWLING:
|
case POWERUP_BOWLING:
|
||||||
Bowling::init(lisp, m_all_meshes[collectType]); break;
|
Bowling::init(lisp, m_all_meshes[collectType]); break;
|
||||||
@ -183,16 +144,5 @@ void PowerupManager::LoadNode(const lisp::Lisp* lisp, int collectType )
|
|||||||
Cake::init(lisp, m_all_meshes[collectType]); break;
|
Cake::init(lisp, m_all_meshes[collectType]); break;
|
||||||
default:;
|
default:;
|
||||||
} // switch
|
} // switch
|
||||||
#else
|
|
||||||
switch (collectType) {
|
|
||||||
case POWERUP_BOWLING:
|
|
||||||
Bowling::init (lisp, m_all_models[collectType]); break;
|
|
||||||
case POWERUP_PLUNGER:
|
|
||||||
Plunger::init (lisp, m_all_models[collectType]); break;
|
|
||||||
case POWERUP_CAKE:
|
|
||||||
Cake::init (lisp, m_all_models[collectType]); break;
|
|
||||||
default:;
|
|
||||||
} // switch
|
|
||||||
#endif
|
|
||||||
} // LoadNode
|
} // LoadNode
|
||||||
|
|
||||||
|
@ -20,17 +20,13 @@
|
|||||||
#ifndef HEADER_POWERUPMANAGER_HPP
|
#ifndef HEADER_POWERUPMANAGER_HPP
|
||||||
#define HEADER_POWERUPMANAGER_HPP
|
#define HEADER_POWERUPMANAGER_HPP
|
||||||
|
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
#include "irrlicht.h"
|
#include "irrlicht.h"
|
||||||
#endif
|
|
||||||
#include "lisp/parser.hpp"
|
#include "lisp/parser.hpp"
|
||||||
#include "lisp/lisp.hpp"
|
#include "lisp/lisp.hpp"
|
||||||
#include "btBulletDynamicsCommon.h"
|
#include "btBulletDynamicsCommon.h"
|
||||||
|
|
||||||
class Material;
|
class Material;
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
class ssgEntity;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The anvil and parachute must be at the end of the enum, and the
|
// The anvil and parachute must be at the end of the enum, and the
|
||||||
// zipper just before them (see Powerup::hitBonusBox).
|
// zipper just before them (see Powerup::hitBonusBox).
|
||||||
@ -48,11 +44,7 @@ protected:
|
|||||||
float m_all_force_to_target[POWERUP_MAX]; // apply this force to move towards
|
float m_all_force_to_target[POWERUP_MAX]; // apply this force to move towards
|
||||||
// the target
|
// the target
|
||||||
float m_all_max_turn_angle[POWERUP_MAX]; // maximum turn angle for homing
|
float m_all_max_turn_angle[POWERUP_MAX]; // maximum turn angle for homing
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
scene::IMesh *m_all_meshes[POWERUP_MAX];
|
scene::IMesh *m_all_meshes[POWERUP_MAX];
|
||||||
#else
|
|
||||||
ssgEntity* m_all_models[POWERUP_MAX];
|
|
||||||
#endif
|
|
||||||
btVector3 m_all_extends[POWERUP_MAX];
|
btVector3 m_all_extends[POWERUP_MAX];
|
||||||
void LoadNode (const lisp::Lisp* lisp, int collectType);
|
void LoadNode (const lisp::Lisp* lisp, int collectType);
|
||||||
public:
|
public:
|
||||||
@ -61,13 +53,9 @@ public:
|
|||||||
void removeTextures ();
|
void removeTextures ();
|
||||||
void Load (int collectType, const char* filename);
|
void Load (int collectType, const char* filename);
|
||||||
Material* getIcon (int type) const {return m_all_icons [type]; }
|
Material* getIcon (int type) const {return m_all_icons [type]; }
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
/** Returns the mesh for a certain powerup.
|
/** Returns the mesh for a certain powerup.
|
||||||
* \param type Mesh type for which the model is returned. */
|
* \param type Mesh type for which the model is returned. */
|
||||||
scene::IMesh *getMesh (int type) const {return m_all_meshes[type]; }
|
scene::IMesh *getMesh (int type) const {return m_all_meshes[type]; }
|
||||||
#else
|
|
||||||
ssgEntity* getModel (int type) const {return m_all_models[type]; }
|
|
||||||
#endif
|
|
||||||
float getForceToTarget(int type) const {return m_all_force_to_target[type]; }
|
float getForceToTarget(int type) const {return m_all_force_to_target[type]; }
|
||||||
float getMaxDistance (int type) const {return m_all_max_distance[type];}
|
float getMaxDistance (int type) const {return m_all_max_distance[type];}
|
||||||
float getMaxTurnAngle (int type) const {return m_all_max_turn_angle[type];}
|
float getMaxTurnAngle (int type) const {return m_all_max_turn_angle[type];}
|
||||||
|
@ -54,7 +54,7 @@ void ProjectileManager::loadData()
|
|||||||
void ProjectileManager::removeTextures()
|
void ProjectileManager::removeTextures()
|
||||||
{
|
{
|
||||||
cleanup();
|
cleanup();
|
||||||
ssgDeRefDelete(m_explosion_model);
|
//ssgDeRefDelete(m_explosion_model);
|
||||||
// Only the explosion is here, all other models are actually managed
|
// Only the explosion is here, all other models are actually managed
|
||||||
// by powerup_manager.
|
// by powerup_manager.
|
||||||
callback_manager->clear(CB_EXPLOSION);
|
callback_manager->clear(CB_EXPLOSION);
|
||||||
@ -78,7 +78,7 @@ void ProjectileManager::cleanup()
|
|||||||
i != m_active_explosions.end(); ++i)
|
i != m_active_explosions.end(); ++i)
|
||||||
{
|
{
|
||||||
stk_scene->remove((ssgTransform*)*i);
|
stk_scene->remove((ssgTransform*)*i);
|
||||||
ssgDeRefDelete(*i);
|
//ssgDeRefDelete(*i);
|
||||||
}
|
}
|
||||||
m_active_explosions.clear();
|
m_active_explosions.clear();
|
||||||
} // cleanup
|
} // cleanup
|
||||||
@ -129,7 +129,7 @@ void ProjectileManager::update(float dt)
|
|||||||
if(!(*e)->hasEnded()) { e++; continue;}
|
if(!(*e)->hasEnded()) { e++; continue;}
|
||||||
Explosion *exp=*e;
|
Explosion *exp=*e;
|
||||||
Explosions::iterator eNext=m_active_explosions.erase(e);
|
Explosions::iterator eNext=m_active_explosions.erase(e);
|
||||||
ssgDeRefDelete(exp); // reduce refcount and free object
|
//ssgDeRefDelete(exp); // reduce refcount and free object
|
||||||
e=eNext;
|
e=eNext;
|
||||||
} // while e!=m_active_explosions.end()
|
} // while e!=m_active_explosions.end()
|
||||||
} // if m_explosion_ended
|
} // if m_explosion_ended
|
||||||
|
@ -17,13 +17,14 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#ifndef HEADER_PROJECTILEMANAGER_H
|
#ifndef HEADER_PROJECTILEMANAGER_HPP
|
||||||
#define HEADER_PROJECTILEMANAGER_H
|
#define HEADER_PROJECTILEMANAGER_HPP
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <plib/ssg.h>
|
#include "irrlicht.h"
|
||||||
#include "items/powerup_manager.hpp"
|
|
||||||
#include "audio/sfx_manager.hpp"
|
#include "audio/sfx_manager.hpp"
|
||||||
|
#include "items/powerup_manager.hpp"
|
||||||
|
|
||||||
class Vec3;
|
class Vec3;
|
||||||
class Kart;
|
class Kart;
|
||||||
@ -44,7 +45,7 @@ private:
|
|||||||
// being shown
|
// being shown
|
||||||
Explosions m_active_explosions;
|
Explosions m_active_explosions;
|
||||||
|
|
||||||
ssgSelector* m_explosion_model;
|
scene::IMesh *m_explosion_model;
|
||||||
bool m_something_was_hit;
|
bool m_something_was_hit;
|
||||||
bool m_explosion_ended;
|
bool m_explosion_ended;
|
||||||
void updateClient(float dt);
|
void updateClient(float dt);
|
||||||
@ -55,9 +56,9 @@ public:
|
|||||||
/** Notifies the projectile manager that something needs to be removed. */
|
/** Notifies the projectile manager that something needs to be removed. */
|
||||||
void notifyRemove () {m_something_was_hit=true; }
|
void notifyRemove () {m_something_was_hit=true; }
|
||||||
void FinishedExplosion() {m_explosion_ended =true; }
|
void FinishedExplosion() {m_explosion_ended =true; }
|
||||||
ssgSelector* getExplosionModel()
|
scene::IMesh* getExplosionModel()
|
||||||
{
|
{
|
||||||
return (ssgSelector*)m_explosion_model->clone();
|
return m_explosion_model;
|
||||||
}
|
}
|
||||||
unsigned int getNumProjectiles() const {return m_active_explosions.size();}
|
unsigned int getNumProjectiles() const {return m_active_explosions.size();}
|
||||||
int getProjectileId (const std::string ident);
|
int getProjectileId (const std::string ident);
|
||||||
|
@ -127,7 +127,7 @@ void KartProperties::load(const std::string &filename, const std::string &node,
|
|||||||
|
|
||||||
|
|
||||||
// Load material
|
// Load material
|
||||||
std::string materials_file = file_manager->getKartFile("materials.dat",getIdent());
|
std::string materials_file = file_manager->getKartFile("materials.xml",getIdent());
|
||||||
file_manager->pushModelSearchPath(file_manager->getKartFile("", getIdent()));
|
file_manager->pushModelSearchPath(file_manager->getKartFile("", getIdent()));
|
||||||
file_manager->pushTextureSearchPath(file_manager->getKartFile("", getIdent()));
|
file_manager->pushTextureSearchPath(file_manager->getKartFile("", getIdent()));
|
||||||
|
|
||||||
|
102
src/material.cpp
@ -30,74 +30,15 @@
|
|||||||
#define UCLAMP 1
|
#define UCLAMP 1
|
||||||
#define VCLAMP 2
|
#define VCLAMP 2
|
||||||
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
int clearSpheremap ( ssgEntity * )
|
|
||||||
{
|
|
||||||
glDisable ( GL_TEXTURE_GEN_S ) ;
|
|
||||||
glDisable ( GL_TEXTURE_GEN_T ) ;
|
|
||||||
return true ;
|
|
||||||
} // clearSpheremap
|
|
||||||
|
|
||||||
//=============================================================================
|
|
||||||
int setSpheremap ( ssgEntity * )
|
|
||||||
{
|
|
||||||
glTexGeni ( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP ) ;
|
|
||||||
glTexGeni ( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP ) ;
|
|
||||||
glEnable ( GL_TEXTURE_GEN_S ) ;
|
|
||||||
glEnable ( GL_TEXTURE_GEN_T ) ;
|
|
||||||
return true ;
|
|
||||||
} // setSpheremap
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//=============================================================================
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
bool Material::parseBool ( char **p )
|
|
||||||
{
|
|
||||||
/* Skip leading spaces */
|
|
||||||
|
|
||||||
while ( **p <= ' ' && **p != '\0' ) (*p)++ ;
|
|
||||||
|
|
||||||
const bool RES = ( ( **p == 'Y' ) || ( **p == 'y' ) ) ;
|
|
||||||
|
|
||||||
while ( **p > ' ' && **p != '\0' ) (*p)++ ;
|
|
||||||
|
|
||||||
return RES ;
|
|
||||||
} // parseBool
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
int Material::parseInt ( char **p )
|
|
||||||
{
|
|
||||||
/* Skip leading spaces */
|
|
||||||
|
|
||||||
while ( **p <= ' ' && **p != '\0' ) (*p)++ ;
|
|
||||||
|
|
||||||
return strtol ( *p, p, 0 ) ;
|
|
||||||
} // parseInt
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
float Material::parseFloat ( char **p )
|
|
||||||
{
|
|
||||||
/* Skip leading spaces */
|
|
||||||
|
|
||||||
while ( **p <= ' ' && **p != '\0' ) (*p)++ ;
|
|
||||||
|
|
||||||
return (float)strtod ( *p, p ) ;
|
|
||||||
} // parseFloat
|
|
||||||
#endif
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
Material::Material(unsigned int index)
|
Material::Material(unsigned int index)
|
||||||
{
|
{
|
||||||
m_texname = "";
|
m_texname = "";
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
m_predraw = m_postdraw = NULL ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
init (index);
|
init (index);
|
||||||
install();
|
install();
|
||||||
} // Material
|
} // Material
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
/** Create a new material using the parameters specified in the xml file.
|
/** Create a new material using the parameters specified in the xml file.
|
||||||
* \param node Node containing the parameters for this material.
|
* \param node Node containing the parameters for this material.
|
||||||
* \param index Index in material_manager.
|
* \param index Index in material_manager.
|
||||||
@ -142,41 +83,6 @@ Material::Material(const std::string& fname, int index, bool is_full_path)
|
|||||||
install(is_full_path);
|
install(is_full_path);
|
||||||
} // Material
|
} // Material
|
||||||
|
|
||||||
#else
|
|
||||||
Material::Material(const std::string& fname, char *description,
|
|
||||||
int index, bool is_full_path)
|
|
||||||
{
|
|
||||||
m_texname = fname;
|
|
||||||
m_predraw = m_postdraw = NULL ;
|
|
||||||
|
|
||||||
init (index);
|
|
||||||
|
|
||||||
if(strlen(description)>0)
|
|
||||||
{
|
|
||||||
m_clamp_tex = parseBool (&description) ? UCLAMP : 0 ;
|
|
||||||
m_clamp_tex += parseBool (&description) ? VCLAMP : 0 ;
|
|
||||||
|
|
||||||
m_transparency = parseBool (&description);
|
|
||||||
m_alpha_ref = parseFloat(&description);
|
|
||||||
m_lighting = parseBool (&description);
|
|
||||||
m_sphere_map = parseBool (&description);
|
|
||||||
m_friction = parseFloat(&description);
|
|
||||||
m_ignore = parseBool (&description);
|
|
||||||
m_zipper = parseBool (&description);
|
|
||||||
m_resetter = parseBool (&description);
|
|
||||||
m_collideable = parseBool (&description);
|
|
||||||
m_max_speed_fraction = parseFloat(&description);
|
|
||||||
m_slowdown = parseFloat(&description);
|
|
||||||
// Set the optional parameters.
|
|
||||||
if(m_max_speed_fraction <= 0.0f)
|
|
||||||
m_max_speed_fraction = 1.0f;
|
|
||||||
if(m_slowdown <= 0.0f)
|
|
||||||
m_slowdown = stk_config->m_slowdown_factor;
|
|
||||||
}
|
|
||||||
install(is_full_path);
|
|
||||||
} // Material
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
Material::~Material()
|
Material::~Material()
|
||||||
{
|
{
|
||||||
@ -203,14 +109,6 @@ void Material::init(unsigned int index)
|
|||||||
m_slowdown = stk_config->m_slowdown_factor;
|
m_slowdown = stk_config->m_slowdown_factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
void Material::applyToLeaf(ssgLeaf *l)
|
|
||||||
{
|
|
||||||
if ( m_predraw ) l -> setCallback ( SSG_CALLBACK_PREDRAW , m_predraw ) ;
|
|
||||||
if ( m_postdraw ) l -> setCallback ( SSG_CALLBACK_POSTDRAW, m_postdraw ) ;
|
|
||||||
} // applyToLeaf
|
|
||||||
#endif
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void Material::install(bool is_full_path)
|
void Material::install(bool is_full_path)
|
||||||
{
|
{
|
||||||
|
@ -22,25 +22,15 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#define _WINSOCKAPI_
|
#define _WINSOCKAPI_
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
#include "irrlicht.h"
|
#include "irrlicht.h"
|
||||||
using namespace irr;
|
using namespace irr;
|
||||||
#else
|
|
||||||
#include <plib/ssg.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class XMLNode;
|
class XMLNode;
|
||||||
|
|
||||||
class Material
|
class Material
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
video::ITexture *m_texture;
|
video::ITexture *m_texture;
|
||||||
#else
|
|
||||||
ssgSimpleState *m_state;
|
|
||||||
ssgCallback m_predraw;
|
|
||||||
ssgCallback m_postdraw;
|
|
||||||
#endif
|
|
||||||
unsigned int m_index;
|
unsigned int m_index;
|
||||||
std::string m_texname;
|
std::string m_texname;
|
||||||
bool m_collideable;
|
bool m_collideable;
|
||||||
@ -57,35 +47,20 @@ private:
|
|||||||
float m_slowdown;
|
float m_slowdown;
|
||||||
/** Maximum speed at which no more slow down occurs. */
|
/** Maximum speed at which no more slow down occurs. */
|
||||||
float m_max_speed_fraction;
|
float m_max_speed_fraction;
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
bool parseBool ( char **p );
|
|
||||||
int parseInt ( char **p );
|
|
||||||
float parseFloat ( char **p );
|
|
||||||
#endif
|
|
||||||
void init (unsigned int index);
|
void init (unsigned int index);
|
||||||
void install (bool is_full_path=false);
|
void install (bool is_full_path=false);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Material(unsigned int index);
|
Material(unsigned int index);
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
Material(const XMLNode *node, int index);
|
Material(const XMLNode *node, int index);
|
||||||
Material(const std::string& fname, int index, bool is_full_path=false);
|
Material(const std::string& fname, int index, bool is_full_path=false);
|
||||||
#else
|
|
||||||
Material(const std::string& fname, char *description, int index,
|
|
||||||
bool is_full_path=false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
~Material ();
|
~Material ();
|
||||||
|
|
||||||
int matches ( char *tx ) ;
|
int matches ( char *tx ) ;
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
/** Returns the ITexture associated with this material. */
|
/** Returns the ITexture associated with this material. */
|
||||||
video::ITexture *getTexture() const { return m_texture; }
|
video::ITexture *getTexture() const { return m_texture; }
|
||||||
#else
|
|
||||||
ssgSimpleState
|
|
||||||
*getState () const { return m_state ; }
|
|
||||||
#endif
|
|
||||||
bool isIgnore () const { return m_ignore; }
|
bool isIgnore () const { return m_ignore; }
|
||||||
bool isZipper () const { return m_zipper; }
|
bool isZipper () const { return m_zipper; }
|
||||||
bool isSphereMap () const { return m_sphere_map; }
|
bool isSphereMap () const { return m_sphere_map; }
|
||||||
@ -100,12 +75,6 @@ public:
|
|||||||
/** Returns the slowdown that happens if a kart is
|
/** Returns the slowdown that happens if a kart is
|
||||||
* faster than the maximum speed. */
|
* faster than the maximum speed. */
|
||||||
float getSlowDown () const { return m_slowdown; }
|
float getSlowDown () const { return m_slowdown; }
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
void apply () { m_state ->apply(); }
|
|
||||||
void force () { m_state ->force(); }
|
|
||||||
void applyToLeaf ( ssgLeaf *l ) ;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,17 +70,9 @@ void MaterialManager::loadMaterial()
|
|||||||
|
|
||||||
// Use temp material for reading, but then set the shared
|
// Use temp material for reading, but then set the shared
|
||||||
// material index later, so that these materials are not popped
|
// material index later, so that these materials are not popped
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
const std::string fname = "materials.xml";
|
const std::string fname = "materials.xml";
|
||||||
#else
|
|
||||||
const std::string fname = "materials.dat";
|
|
||||||
#endif
|
|
||||||
std::string full_name = file_manager->getTextureFile(fname);
|
std::string full_name = file_manager->getTextureFile(fname);
|
||||||
addSharedMaterial(full_name);
|
addSharedMaterial(full_name);
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
ssgSetAppStateCallback(getAppState);
|
|
||||||
fuzzy_gst = getMaterial("fuzzy.rgb")->getState();
|
|
||||||
#endif
|
|
||||||
// Save index of shared textures
|
// Save index of shared textures
|
||||||
m_shared_material_index = (int)m_materials.size();
|
m_shared_material_index = (int)m_materials.size();
|
||||||
} // MaterialManager
|
} // MaterialManager
|
||||||
@ -108,8 +100,8 @@ void MaterialManager::addSharedMaterial(const std::string& filename)
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool MaterialManager::pushTempMaterial(const std::string& filename)
|
bool MaterialManager::pushTempMaterial(const std::string& filename)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
XMLReader *xml = file_manager->getXMLReader(filename);
|
XMLReader *xml = file_manager->getXMLReader(filename);
|
||||||
|
if(!xml) return true;
|
||||||
for(unsigned int i=0; i<xml->getNumNodes(); i++)
|
for(unsigned int i=0; i<xml->getNumNodes(); i++)
|
||||||
{
|
{
|
||||||
const XMLNode *node = xml->getNode(i);
|
const XMLNode *node = xml->getNode(i);
|
||||||
@ -130,17 +122,6 @@ bool MaterialManager::pushTempMaterial(const std::string& filename)
|
|||||||
}
|
}
|
||||||
} // for i<xml->getNumNodes)(
|
} // for i<xml->getNumNodes)(
|
||||||
return true;
|
return true;
|
||||||
#else
|
|
||||||
FILE *fd = fopen(filename.c_str(), "r" );
|
|
||||||
|
|
||||||
if ( fd == NULL ) return false;
|
|
||||||
|
|
||||||
while ( parseMaterial ( fd ) )
|
|
||||||
/* Read file */ ;
|
|
||||||
|
|
||||||
fclose ( fd ) ;
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
} // pushTempMaterial
|
} // pushTempMaterial
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -153,71 +134,6 @@ void MaterialManager::popTempMaterial()
|
|||||||
} // for i
|
} // for i
|
||||||
} // popTempMaterial
|
} // popTempMaterial
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
char* MaterialManager::parseFileName(char **str)
|
|
||||||
{
|
|
||||||
char *p = *str ;
|
|
||||||
|
|
||||||
/* Skip leading spaces */
|
|
||||||
while ( *p <= ' ' && *p != '\0' ) p++ ;
|
|
||||||
|
|
||||||
/* Skip blank lines and comments */
|
|
||||||
if ( *p == '#' || *p == '\0' )
|
|
||||||
return NULL ;
|
|
||||||
|
|
||||||
if ( *p != '"' )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "ERROR: Material file entries must start with '\"'\n"
|
|
||||||
"ERROR: Offending line is '%s'\n", *str);
|
|
||||||
return NULL ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Filename? */
|
|
||||||
char *f = ++p ;
|
|
||||||
while ( *p != '"' && *p != '\0' ) p++ ;
|
|
||||||
|
|
||||||
if ( *p != '"' )
|
|
||||||
{
|
|
||||||
fprintf(stderr,
|
|
||||||
"ERROR: Unterminated string constant '%s' in materials file.\n", *str ) ;
|
|
||||||
return NULL ;
|
|
||||||
}
|
|
||||||
|
|
||||||
*p = '\0' ;
|
|
||||||
*str = ++p ;
|
|
||||||
|
|
||||||
return f ;
|
|
||||||
} // parseFilename
|
|
||||||
#endif
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
int MaterialManager::parseMaterial ( FILE *fd )
|
|
||||||
{
|
|
||||||
char str [ 1024 ] ;
|
|
||||||
|
|
||||||
while ( ! feof ( fd ) )
|
|
||||||
{
|
|
||||||
char *s = str ;
|
|
||||||
|
|
||||||
if ( fgets ( s, 1024, fd ) == NULL )
|
|
||||||
return false ;
|
|
||||||
|
|
||||||
s [ strlen(s) - 1 ] = '\0' ;
|
|
||||||
|
|
||||||
char *f = parseFileName ( & s ) ;
|
|
||||||
|
|
||||||
if ( f != NULL )
|
|
||||||
{
|
|
||||||
m_materials.push_back(new Material (f, s, m_materials.size() ));
|
|
||||||
return true ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false ;
|
|
||||||
} // parseMaterial
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
Material *MaterialManager::getMaterial ( ssgLeaf *l )
|
Material *MaterialManager::getMaterial ( ssgLeaf *l )
|
||||||
{
|
{
|
||||||
@ -262,22 +178,9 @@ Material *MaterialManager::getMaterial(const std::string& fname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the new material
|
// Add the new material
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
Material* m=new Material(fname, m_materials.size(), is_full_path);
|
Material* m=new Material(fname, m_materials.size(), is_full_path);
|
||||||
#else
|
|
||||||
Material* m=new Material(fname, "", m_materials.size(), is_full_path);
|
|
||||||
#endif
|
|
||||||
m_materials.push_back(m);
|
m_materials.push_back(m);
|
||||||
if(make_permanent) m_shared_material_index = (int)m_materials.size();
|
if(make_permanent) m_shared_material_index = (int)m_materials.size();
|
||||||
return m ;
|
return m ;
|
||||||
} // getMaterial
|
} // getMaterial
|
||||||
|
|
||||||
//=============================================================================
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
ssgState *getAppState ( char *fname )
|
|
||||||
{
|
|
||||||
Material *m = material_manager->getMaterial ( fname ) ;
|
|
||||||
return ( m == NULL ) ? NULL : m -> getState () ;
|
|
||||||
} // getAppState
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
@ -32,10 +32,6 @@ class MaterialManager
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
char *parseFileName(char **str);
|
|
||||||
int parseMaterial(FILE *fd);
|
|
||||||
#endif
|
|
||||||
void parseMaterialFile(const std::string& filename);
|
void parseMaterialFile(const std::string& filename);
|
||||||
int m_shared_material_index;
|
int m_shared_material_index;
|
||||||
|
|
||||||
@ -53,10 +49,6 @@ public:
|
|||||||
void popTempMaterial ();
|
void popTempMaterial ();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ssgState *fuzzy_gst;//, *herringbones_gst;
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
ssgState *getAppState ( char *fname ) ;
|
|
||||||
#endif
|
|
||||||
extern MaterialManager *material_manager;
|
extern MaterialManager *material_manager;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -59,11 +59,7 @@ SDLDriver::SDLDriver()
|
|||||||
: m_sensed_input(0), m_action_map(0), m_main_surface(0), m_flags(0), m_stick_infos(0),
|
: m_sensed_input(0), m_action_map(0), m_main_surface(0), m_flags(0), m_stick_infos(0),
|
||||||
m_mode(BOOTSTRAP), m_mouse_val_x(0), m_mouse_val_y(0)
|
m_mode(BOOTSTRAP), m_mouse_val_x(0), m_mouse_val_y(0)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_IRRLICHT
|
|
||||||
if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_TIMER) < 0)
|
if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_TIMER) < 0)
|
||||||
#else
|
|
||||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_TIMER) < 0)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
|
fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError());
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -109,9 +105,6 @@ SDLDriver::SDLDriver()
|
|||||||
SDL_JoystickEventState(SDL_ENABLE);
|
SDL_JoystickEventState(SDL_ENABLE);
|
||||||
|
|
||||||
initStickInfos();
|
initStickInfos();
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
SDL_WM_SetCaption("SuperTuxKart", NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Get into menu mode initially.
|
// Get into menu mode initially.
|
||||||
setMode(MENU);
|
setMode(MENU);
|
||||||
@ -260,52 +253,6 @@ void SDLDriver::toggleFullscreen(bool resetTextures)
|
|||||||
*/
|
*/
|
||||||
void SDLDriver::setVideoMode(bool resetTextures)
|
void SDLDriver::setVideoMode(bool resetTextures)
|
||||||
{
|
{
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
//Is SDL_FreeSurface necessary? SDL wiki says not??
|
|
||||||
SDL_FreeSurface(m_main_surface);
|
|
||||||
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
|
|
||||||
|
|
||||||
m_main_surface = SDL_SetVideoMode(user_config->m_width, user_config->m_height, 0, m_flags);
|
|
||||||
|
|
||||||
if (!m_main_surface)
|
|
||||||
{
|
|
||||||
//ask for lower quality as a fallback
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
|
|
||||||
|
|
||||||
m_main_surface = SDL_SetVideoMode(user_config->m_width, user_config->m_height, 0, m_flags);
|
|
||||||
if (m_main_surface)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Using fallback OpenGL settings\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//one last attempt: get rid of the alpha channel
|
|
||||||
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0);
|
|
||||||
|
|
||||||
m_main_surface = SDL_SetVideoMode(user_config->m_width, user_config->m_height, 0, m_flags);
|
|
||||||
if (m_main_surface)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Using fallback OpenGL settings, without alpha channel\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(stderr, "SDL_SetVideoMode (%dx%d) failed: %s\n",
|
|
||||||
user_config->m_width, user_config->m_height, SDL_GetError());
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
} // !m_main_surface
|
|
||||||
} // !m_main_surface
|
|
||||||
#endif
|
|
||||||
#if defined(WIN32) || defined(__APPLE__)
|
#if defined(WIN32) || defined(__APPLE__)
|
||||||
if(resetTextures)
|
if(resetTextures)
|
||||||
{
|
{
|
||||||
@ -361,10 +308,6 @@ SDLDriver::~SDLDriver()
|
|||||||
// FIXME LEAK: delete m_action_map if defined
|
// FIXME LEAK: delete m_action_map if defined
|
||||||
SDL_FreeSurface(m_main_surface);
|
SDL_FreeSurface(m_main_surface);
|
||||||
|
|
||||||
#ifndef HAVE_IRRLICHT
|
|
||||||
// Irrlicht calls SDL_Quit otherwise
|
|
||||||
SDL_Quit();
|
|
||||||
#endif
|
|
||||||
} // ~SDLDriver
|
} // ~SDLDriver
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -1197,7 +1197,7 @@ void Track::loadTrackModel()
|
|||||||
// First read the temporary materials.dat file if it exists
|
// First read the temporary materials.dat file if it exists
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::string materials_file = file_manager->getTrackFile("materials.dat",getIdent());
|
std::string materials_file = file_manager->getTrackFile("materials.xml",getIdent());
|
||||||
material_manager->pushTempMaterial(materials_file);
|
material_manager->pushTempMaterial(materials_file);
|
||||||
}
|
}
|
||||||
catch (std::exception& e)
|
catch (std::exception& e)
|
||||||
|