Try to add support for having dsome materials ignore fog. Works for lighthouse light, but not for lighthouse sky
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8866 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -90,7 +90,8 @@ Material::Material(const XMLNode *node, int index)
|
||||
node->get("slowdown-time", &m_slowdown_time );
|
||||
node->get("backface-culling", &m_backface_culling );
|
||||
node->get("disable-z-write", &m_disable_z_write );
|
||||
|
||||
node->get("fog", &m_fog );
|
||||
|
||||
node->get("mask", &m_mask);
|
||||
|
||||
if (node->get("normal-map", &m_normal_map_tex))
|
||||
@@ -224,6 +225,7 @@ void Material::init(unsigned int index)
|
||||
m_crash_reset = false;
|
||||
m_add = false;
|
||||
m_disable_z_write = false;
|
||||
m_fog = true;
|
||||
m_max_speed_fraction = 1.0f;
|
||||
m_slowdown_time = 1.0f;
|
||||
m_sfx_name = "";
|
||||
@@ -586,5 +588,13 @@ void Material::setMaterialProperties(video::SMaterial *m) const
|
||||
if (UserConfigParams::m_fullscreen_antialiasing)
|
||||
m->AntiAliasing = video::EAAM_LINE_SMOOTH;
|
||||
|
||||
|
||||
} // setMaterialProperties
|
||||
} // setMaterialProperties
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void Material::adjustForFog(scene::ISceneNode* parent, video::SMaterial *m, bool use_fog) const
|
||||
{
|
||||
printf("<%s> Fog enable : %i\n", m_texname.c_str(), m_fog);
|
||||
m->setFlag(video::EMF_FOG_ENABLE, m_fog && use_fog);
|
||||
parent->setMaterialFlag(video::EMF_FOG_ENABLE, m_fog && use_fog);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
namespace irr
|
||||
{
|
||||
namespace video { class ITexture; class SMaterial; }
|
||||
namespace scene { class ISceneNode; }
|
||||
}
|
||||
using namespace irr;
|
||||
|
||||
@@ -84,6 +85,8 @@ private:
|
||||
bool m_ignore;
|
||||
bool m_add;
|
||||
|
||||
bool m_fog;
|
||||
|
||||
ParticleKind* m_particles_effects[EMIT_KINDS_COUNT];
|
||||
|
||||
/** For normal maps */
|
||||
@@ -159,6 +162,8 @@ public:
|
||||
|
||||
void setSFXSpeed(SFXBase *sfx, float speed) const;
|
||||
void setMaterialProperties(video::SMaterial *m) const;
|
||||
void adjustForFog(scene::ISceneNode* parent, video::SMaterial *m, bool use_fog) const;
|
||||
|
||||
/** Returns the ITexture associated with this material. */
|
||||
video::ITexture *getTexture() const { return m_texture; }
|
||||
bool isIgnore () const { return m_ignore; }
|
||||
@@ -212,6 +217,8 @@ public:
|
||||
const std::string &
|
||||
getSFXName () const { return m_sfx_name; }
|
||||
|
||||
bool isFogEnabled() const { return m_fog; }
|
||||
|
||||
/**
|
||||
* \brief Get the kind of particles that are to be used on this material, in the given conditions
|
||||
* \return The particles to use, or NULL if none
|
||||
|
||||
@@ -89,7 +89,28 @@ void MaterialManager::setAllMaterialFlags(video::ITexture* t,
|
||||
}
|
||||
|
||||
} // setAllMaterialFlags
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void MaterialManager::adjustForFog(video::ITexture* t,
|
||||
scene::IMeshBuffer *mb,
|
||||
scene::ISceneNode* parent,
|
||||
bool use_fog) const
|
||||
{
|
||||
const std::string image = StringUtils::getBasename(core::stringc(t->getName()).c_str());
|
||||
// Search backward so that temporary (track) textures are found first
|
||||
for(int i = (int)m_materials.size()-1; i>=0; i-- )
|
||||
{
|
||||
if (m_materials[i]->getTexFname()==image)
|
||||
{
|
||||
m_materials[i]->adjustForFog(parent, &(mb->getMaterial()), use_fog);
|
||||
return;
|
||||
}
|
||||
} // for i
|
||||
} // adjustForFog
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
void MaterialManager::setAllUntexturedMaterialFlags(scene::IMeshBuffer *mb) const
|
||||
{
|
||||
for(int i = (int)m_materials.size()-1; i>=0; i-- )
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
namespace irr
|
||||
{
|
||||
namespace video { class ITexture; }
|
||||
namespace scene { class IMeshBuffer; }
|
||||
namespace scene { class IMeshBuffer; class ISceneNode; }
|
||||
}
|
||||
using namespace irr;
|
||||
|
||||
@@ -52,6 +52,10 @@ public:
|
||||
void loadMaterial ();
|
||||
void setAllMaterialFlags(video::ITexture* t,
|
||||
scene::IMeshBuffer *mb) const;
|
||||
void adjustForFog(video::ITexture* t,
|
||||
scene::IMeshBuffer *mb,
|
||||
scene::ISceneNode* parent,
|
||||
bool use_fog) const;
|
||||
|
||||
void setAllUntexturedMaterialFlags(scene::IMeshBuffer *mb) const;
|
||||
|
||||
|
||||
@@ -1281,14 +1281,14 @@ void Track::loadTrackModel(World* parent, unsigned int mode_id)
|
||||
}
|
||||
|
||||
// Enable for for all track nodes if fog is used
|
||||
if(m_use_fog)
|
||||
{
|
||||
//if(m_use_fog)
|
||||
//{
|
||||
const unsigned int count = m_all_nodes.size();
|
||||
for(unsigned int i=0; i<count; i++)
|
||||
{
|
||||
adjustForFog(m_all_nodes[i]);
|
||||
}
|
||||
}
|
||||
//}
|
||||
m_track_object_manager->enableFog(m_use_fog);
|
||||
|
||||
// Sky dome and boxes support
|
||||
@@ -1377,14 +1377,61 @@ void Track::loadTrackModel(World* parent, unsigned int mode_id)
|
||||
*/
|
||||
void Track::adjustForFog(scene::ISceneNode *node)
|
||||
{
|
||||
node->setMaterialFlag(video::EMF_FOG_ENABLE, m_use_fog);
|
||||
//irr_driver->setAllMaterialFlags(scene::IMesh *mesh)
|
||||
|
||||
if (node->getType() == scene::ESNT_MESH || node->getType() == scene::ESNT_OCTREE)
|
||||
{
|
||||
scene::IMeshSceneNode* mnode = (scene::IMeshSceneNode*)node;
|
||||
scene::IMesh* mesh = mnode->getMesh();
|
||||
//irr_driver->setAllMaterialFlags(node->getMesh());
|
||||
|
||||
unsigned int n = mesh->getMeshBufferCount();
|
||||
for (unsigned int i=0; i<n; i++)
|
||||
{
|
||||
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
|
||||
video::SMaterial &irr_material=mb->getMaterial();
|
||||
for (unsigned int j=0; j<video::MATERIAL_MAX_TEXTURES; j++)
|
||||
{
|
||||
video::ITexture* t = irr_material.getTexture(j);
|
||||
if (t) material_manager->adjustForFog(t, mb, mnode, m_use_fog);
|
||||
|
||||
} // for j<MATERIAL_MAX_TEXTURES
|
||||
} // for i<getMeshBufferCount()
|
||||
}
|
||||
else if (node->getType() == scene::ESNT_ANIMATED_MESH)
|
||||
{
|
||||
scene::IAnimatedMeshSceneNode* mnode = (scene::IAnimatedMeshSceneNode*)node;
|
||||
scene::IMesh* mesh = mnode->getMesh();
|
||||
//irr_driver->setAllMaterialFlags(node->getMesh());
|
||||
|
||||
unsigned int n = mesh->getMeshBufferCount();
|
||||
for (unsigned int i=0; i<n; i++)
|
||||
{
|
||||
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
|
||||
video::SMaterial &irr_material=mb->getMaterial();
|
||||
for (unsigned int j=0; j<video::MATERIAL_MAX_TEXTURES; j++)
|
||||
{
|
||||
video::ITexture* t = irr_material.getTexture(j);
|
||||
if (t) material_manager->adjustForFog(t, mb, mnode, m_use_fog);
|
||||
|
||||
} // for j<MATERIAL_MAX_TEXTURES
|
||||
} // for i<getMeshBufferCount()
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int t = node->getType();
|
||||
const char* type = (const char*)&t;
|
||||
printf("Unknown mesh type %c%c%c%c\n", type[0], type[1], type[2], type[3]);
|
||||
node->setMaterialFlag(video::EMF_FOG_ENABLE, m_use_fog);
|
||||
}
|
||||
|
||||
if (node->getType() == scene::ESNT_LOD_NODE)
|
||||
{
|
||||
std::vector<scene::ISceneNode*>& subnodes = ((LODNode*)node)->getAllNodes();
|
||||
for (unsigned int n=0; n<subnodes.size(); n++)
|
||||
{
|
||||
subnodes[n]->setMaterialFlag(video::EMF_FOG_ENABLE, m_use_fog);
|
||||
adjustForFog(subnodes[n]);
|
||||
//subnodes[n]->setMaterialFlag(video::EMF_FOG_ENABLE, m_use_fog);
|
||||
}
|
||||
}
|
||||
} // adjustForFog
|
||||
|
||||
@@ -23,10 +23,13 @@
|
||||
#include "animations/billboard_animation.hpp"
|
||||
#include "animations/three_d_animation.hpp"
|
||||
#include "graphics/lod_node.hpp"
|
||||
#include "graphics/material_manager.hpp"
|
||||
#include "io/xml_node.hpp"
|
||||
#include "physics/physical_object.hpp"
|
||||
#include "tracks/track_object.hpp"
|
||||
|
||||
#include <IMeshSceneNode.h>
|
||||
|
||||
TrackObjectManager::TrackObjectManager()
|
||||
{
|
||||
} // TrackObjectManager
|
||||
@@ -116,6 +119,69 @@ void TrackObjectManager::update(float dt)
|
||||
}
|
||||
} // update
|
||||
|
||||
void adjustForFog(scene::ISceneNode *node, bool enable)
|
||||
{
|
||||
//irr_driver->setAllMaterialFlags(scene::IMesh *mesh)
|
||||
|
||||
if (node->getType() == scene::ESNT_MESH || node->getType() == scene::ESNT_OCTREE)
|
||||
{
|
||||
scene::IMeshSceneNode* mnode = (scene::IMeshSceneNode*)node;
|
||||
scene::IMesh* mesh = mnode->getMesh();
|
||||
//irr_driver->setAllMaterialFlags(node->getMesh());
|
||||
|
||||
unsigned int n = mesh->getMeshBufferCount();
|
||||
for (unsigned int i=0; i<n; i++)
|
||||
{
|
||||
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
|
||||
video::SMaterial &irr_material=mb->getMaterial();
|
||||
for (unsigned int j=0; j<video::MATERIAL_MAX_TEXTURES; j++)
|
||||
{
|
||||
video::ITexture* t = irr_material.getTexture(j);
|
||||
if (t) material_manager->adjustForFog(t, mb, mnode, enable);
|
||||
|
||||
} // for j<MATERIAL_MAX_TEXTURES
|
||||
} // for i<getMeshBufferCount()
|
||||
}
|
||||
else if (node->getType() == scene::ESNT_ANIMATED_MESH)
|
||||
{
|
||||
scene::IAnimatedMeshSceneNode* mnode = (scene::IAnimatedMeshSceneNode*)node;
|
||||
scene::IMesh* mesh = mnode->getMesh();
|
||||
//irr_driver->setAllMaterialFlags(node->getMesh());
|
||||
|
||||
unsigned int n = mesh->getMeshBufferCount();
|
||||
for (unsigned int i=0; i<n; i++)
|
||||
{
|
||||
scene::IMeshBuffer *mb = mesh->getMeshBuffer(i);
|
||||
video::SMaterial &irr_material=mb->getMaterial();
|
||||
for (unsigned int j=0; j<video::MATERIAL_MAX_TEXTURES; j++)
|
||||
{
|
||||
video::ITexture* t = irr_material.getTexture(j);
|
||||
if (t) material_manager->adjustForFog(t, mb, mnode, enable);
|
||||
|
||||
} // for j<MATERIAL_MAX_TEXTURES
|
||||
} // for i<getMeshBufferCount()
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int t = node->getType();
|
||||
const char* type = (const char*)&t;
|
||||
printf("Unknown mesh type %c%c%c%c\n", type[0], type[1], type[2], type[3]);
|
||||
node->setMaterialFlag(video::EMF_FOG_ENABLE, enable);
|
||||
}
|
||||
|
||||
if (node->getType() == scene::ESNT_LOD_NODE)
|
||||
{
|
||||
std::vector<scene::ISceneNode*>& subnodes = ((LODNode*)node)->getAllNodes();
|
||||
for (unsigned int n=0; n<subnodes.size(); n++)
|
||||
{
|
||||
adjustForFog(subnodes[n], enable);
|
||||
//subnodes[n]->setMaterialFlag(video::EMF_FOG_ENABLE, m_use_fog);
|
||||
}
|
||||
}
|
||||
} // adjustForFog
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void TrackObjectManager::enableFog(bool enable)
|
||||
@@ -123,15 +189,8 @@ void TrackObjectManager::enableFog(bool enable)
|
||||
TrackObject* curr;
|
||||
for_in (curr, m_all_objects)
|
||||
{
|
||||
curr->getNode()->setMaterialFlag(video::EMF_FOG_ENABLE, enable);
|
||||
|
||||
if (curr->getNode()->getType() == scene::ESNT_LOD_NODE)
|
||||
{
|
||||
std::vector<scene::ISceneNode*>& nodes = ((LODNode*)curr->getNode())->getAllNodes();
|
||||
for (unsigned int n=0; n<nodes.size(); n++)
|
||||
{
|
||||
nodes[n]->setMaterialFlag(video::EMF_FOG_ENABLE, enable);
|
||||
}
|
||||
}
|
||||
//curr->getNode()->setMaterialFlag(video::EMF_FOG_ENABLE, enable);
|
||||
|
||||
adjustForFog(curr->getNode(), enable);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user