Fix : objects like the subsea seagul would be animated even when animations were turned off

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@11314 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria
2012-06-17 00:05:32 +00:00
parent be37c90147
commit 9dd3bb9468
3 changed files with 89 additions and 21 deletions

View File

@@ -35,6 +35,7 @@ using namespace irr;
#include <ISceneManager.h>
#include <IMeshManipulator.h>
#include <IMeshSceneNode.h>
// ----------------------------------------------------------------------------
PhysicalObject::PhysicalObject(const XMLNode &xml_node)
@@ -125,9 +126,29 @@ void PhysicalObject::init()
// 1. Determine size of the object
// -------------------------------
Vec3 min, max;
scene::IAnimatedMesh *mesh
= ((scene::IAnimatedMeshSceneNode*)m_node)->getMesh();
MeshTools::minMax3D(mesh, &min, &max);
if (m_node->getType() == scene::ESNT_ANIMATED_MESH)
{
scene::IAnimatedMesh *mesh
= ((scene::IAnimatedMeshSceneNode*)m_node)->getMesh();
MeshTools::minMax3D(mesh, &min, &max);
}
else if (m_node->getType()==scene::ESNT_MESH)
{
scene::IMesh *mesh
= ((scene::IMeshSceneNode*)m_node)->getMesh();
MeshTools::minMax3D(mesh, &min, &max);
}
else
{
fprintf(stderr, "[PhysicalObject] Unknown node type\n");
max = 1.0f;
min = 0.0f;
assert(false);
}
Vec3 extend = max-min;
// Adjust the mesth of the graphical object so that its center is where it
// is in bullet (usually at (0,0,0)). It can be changed in the case clause

View File

@@ -29,6 +29,8 @@
#include "modes/world.hpp"
#include "tracks/track.hpp"
#include <IMeshSceneNode.h>
/** A track object: any additional object on the track. This object implements
* a graphics-only representation, i.e. there is no physical representation.
* Derived classes can implement a physical representation (see
@@ -145,16 +147,27 @@ TrackObject::TrackObject(const XMLNode &xml_node)
std::string full_path =
World::getWorld()->getTrack()->getTrackFile(model_name);
if(file_manager->fileExists(full_path))
bool animated = (UserConfigParams::m_graphical_effects ||
World::getWorld()->getIdent() == IDENT_CUSTSCENE);
if (file_manager->fileExists(full_path))
{
m_mesh = irr_driver->getAnimatedMesh(full_path);
if (animated)
{
m_mesh = irr_driver->getAnimatedMesh(full_path);
}
else
{
m_mesh = irr_driver->getMesh(full_path);
}
}
if(!m_mesh)
{
// If the model isn't found in the track directory, look
// in STK's model directory.
full_path = file_manager->getModelFile(model_name);
m_mesh = irr_driver->getAnimatedMesh(full_path);
m_mesh = irr_driver->getAnimatedMesh(full_path);
if(!m_mesh)
{
@@ -164,18 +177,29 @@ TrackObject::TrackObject(const XMLNode &xml_node)
m_mesh->grab();
irr_driver->grabAllTextures(m_mesh);
scene::IAnimatedMeshSceneNode *node =
irr_driver->addAnimatedMesh(m_mesh);
m_node = node;
if (animated)
{
scene::IAnimatedMeshSceneNode *node =
irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_mesh);
m_node = node;
m_frame_start = node->getStartFrame();
xml_node.get("frame-start", &m_frame_start);
m_frame_end = node->getEndFrame();
xml_node.get("frame-end", &m_frame_end);
}
else
{
m_node = irr_driver->addMesh(m_mesh);
m_frame_start = 0.0f;
m_frame_end = 0.0f;
}
#ifdef DEBUG
std::string debug_name = model_name+" (track-object)";
m_node->setName(debug_name.c_str());
#endif
m_frame_start = node->getStartFrame();
xml_node.get("frame-start", &m_frame_start);
m_frame_end = node->getEndFrame();
xml_node.get("frame-end", &m_frame_end);
if(!m_enabled)
m_node->setVisible(false);
@@ -207,10 +231,21 @@ TrackObject::TrackObject(const core::vector3df& pos, const core::vector3df& hpr,
}
else
{
if(file_manager->fileExists(model_name))
bool animated = (UserConfigParams::m_graphical_effects ||
World::getWorld()->getIdent() == IDENT_CUSTSCENE);
if (file_manager->fileExists(model_name))
{
m_mesh = irr_driver->getAnimatedMesh(model_name);
if (animated)
{
m_mesh = irr_driver->getAnimatedMesh(model_name);
}
else
{
m_mesh = irr_driver->getMesh(model_name);
}
}
if(!m_mesh)
{
fprintf(stderr, "Warning: '%s' not found and is ignored.\n",
@@ -220,14 +255,26 @@ TrackObject::TrackObject(const core::vector3df& pos, const core::vector3df& hpr,
m_mesh->grab();
irr_driver->grabAllTextures(m_mesh);
scene::IAnimatedMeshSceneNode *node=irr_driver->addAnimatedMesh(m_mesh);
m_node = node;
if (animated)
{
scene::IAnimatedMeshSceneNode *node = irr_driver->addAnimatedMesh((scene::IAnimatedMesh*)m_mesh);
m_node = node;
m_frame_start = node->getStartFrame();
m_frame_end = node->getEndFrame();
}
else
{
m_node = irr_driver->addMesh(m_mesh);
m_frame_start = 0.0f;
m_frame_end = 0.0f;
}
#ifdef DEBUG
std::string debug_name = model_name+" (track-object)";
m_node->setName(debug_name.c_str());
#endif
m_frame_start = node->getStartFrame();
m_frame_end = node->getEndFrame();
if(!m_enabled)
m_node->setVisible(false);

View File

@@ -74,7 +74,7 @@ protected:
/** The mesh used here. It needs to be stored so that it can be
* removed from irrlicht's mesh cache when it is deleted. */
scene::IAnimatedMesh *m_mesh;
scene::IMesh *m_mesh;
/** The initial XYZ position of the object. */
core::vector3df m_init_xyz;