Fix colorization of wheels and speed weight objects

This commit is contained in:
Benau
2016-06-30 11:01:56 +08:00
parent 5bb2a5cf7e
commit a55ab7f707
7 changed files with 26 additions and 19 deletions

View File

@@ -1170,7 +1170,8 @@ scene::IParticleSystemSceneNode *IrrDriver::addParticleNode(bool default_emitter
scene::IMeshSceneNode *IrrDriver::addMesh(scene::IMesh *mesh,
const std::string& debug_name,
scene::ISceneNode *parent,
RenderInfo* render_info)
RenderInfo* render_info,
bool all_parts_colorized)
{
if (!CVS->isGLSL())
return m_scene_manager->addMeshSceneNode(mesh, parent);
@@ -1184,7 +1185,8 @@ scene::IMeshSceneNode *IrrDriver::addMesh(scene::IMesh *mesh,
core::vector3df(0, 0, 0),
core::vector3df(0, 0, 0),
core::vector3df(1.0f, 1.0f, 1.0f),
true, render_info);
true, render_info,
all_parts_colorized);
node->drop();
return node;
@@ -1367,7 +1369,7 @@ void IrrDriver::removeTexture(video::ITexture *t)
*/
scene::IAnimatedMeshSceneNode *IrrDriver::addAnimatedMesh(scene::IAnimatedMesh *mesh,
const std::string& debug_name, scene::ISceneNode* parent,
RenderInfo* render_info)
RenderInfo* render_info, bool all_parts_colorized)
{
if (!CVS->isGLSL())
{
@@ -1383,7 +1385,7 @@ scene::IAnimatedMeshSceneNode *IrrDriver::addAnimatedMesh(scene::IAnimatedMesh *
scene::IAnimatedMeshSceneNode* node =
new STKAnimatedMesh(mesh, parent, m_scene_manager, -1, debug_name,
core::vector3df(0, 0, 0), core::vector3df(0, 0, 0),
core::vector3df(1, 1, 1), render_info);
core::vector3df(1, 1, 1), render_info, all_parts_colorized);
node->drop();
return node;
} // addAnimatedMesh

View File

@@ -388,7 +388,8 @@ public:
scene::IMeshSceneNode*addMesh(scene::IMesh *mesh,
const std::string& debug_name,
scene::ISceneNode *parent = NULL,
RenderInfo* render_info = NULL);
RenderInfo* render_info = NULL,
bool all_parts_colorized = false);
PerCameraNode *addPerCameraNode(scene::ISceneNode* node,
scene::ICameraSceneNode* cam,
scene::ISceneNode *parent = NULL);
@@ -411,7 +412,8 @@ public:
*addAnimatedMesh(scene::IAnimatedMesh *mesh,
const std::string& debug_name,
scene::ISceneNode* parent = NULL,
RenderInfo* render_info = NULL);
RenderInfo* render_info = NULL,
bool all_parts_colorized = false);
scene::ICameraSceneNode
*addCameraSceneNode();
Camera *addCamera(unsigned int index, AbstractKart *kart);

View File

@@ -39,12 +39,13 @@ STKAnimatedMesh::STKAnimatedMesh(irr::scene::IAnimatedMesh* mesh, irr::scene::IS
irr::scene::ISceneManager* mgr, s32 id, const std::string& debug_name,
const core::vector3df& position,
const core::vector3df& rotation,
const core::vector3df& scale, RenderInfo* render_info) :
const core::vector3df& scale, RenderInfo* render_info, bool all_parts_colorized) :
CAnimatedMeshSceneNode(mesh, parent, mgr, id, position, rotation, scale)
{
isGLInitialized = false;
isMaterialInitialized = false;
m_mesh_render_info = render_info;
m_all_parts_colorized = all_parts_colorized;
#ifdef DEBUG
m_debug_name = debug_name;
#endif
@@ -103,14 +104,14 @@ void STKAnimatedMesh::updateNoGL()
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
bool affected = false;
if (mb && m_mesh_render_info)
if (!m_all_parts_colorized && mb && m_mesh_render_info)
{
// Test if material is affected by hue change
affected = m_mesh_render_info->isColorizable(i);
}
GLmeshes.push_back(allocateMeshBuffer(mb, m_debug_name,
affected ? m_mesh_render_info : NULL));
affected || m_all_parts_colorized ? m_mesh_render_info : NULL));
}
for (u32 i = 0; i < m->getMeshBufferCount(); ++i)

View File

@@ -43,7 +43,7 @@ public:
const irr::core::vector3df& position = irr::core::vector3df(0,0,0),
const irr::core::vector3df& rotation = irr::core::vector3df(0,0,0),
const irr::core::vector3df& scale = irr::core::vector3df(1.0f, 1.0f, 1.0f),
RenderInfo* render_info = NULL);
RenderInfo* render_info = NULL, bool all_parts_colorized = false);
~STKAnimatedMesh();
virtual void render();
@@ -51,6 +51,7 @@ public:
virtual bool glow() const { return false; }
private:
RenderInfo* m_mesh_render_info;
bool m_all_parts_colorized;
};
#endif // STKANIMATEDMESH_HPP

View File

@@ -54,7 +54,7 @@ STKMeshSceneNode::STKMeshSceneNode(irr::scene::IMesh* mesh, ISceneNode* parent,
irr::s32 id, const std::string& debug_name,
const irr::core::vector3df& position,
const irr::core::vector3df& rotation,
const irr::core::vector3df& scale, bool createGLMeshes, RenderInfo* render_info) :
const irr::core::vector3df& scale, bool createGLMeshes, RenderInfo* render_info, bool all_parts_colorized) :
CMeshSceneNode(mesh, parent, mgr, id, position, rotation, scale)
{
isDisplacement = false;
@@ -65,7 +65,7 @@ STKMeshSceneNode::STKMeshSceneNode(irr::scene::IMesh* mesh, ISceneNode* parent,
m_debug_name = debug_name;
if (createGLMeshes)
this->createGLMeshes(render_info);
this->createGLMeshes(render_info, all_parts_colorized);
}
void STKMeshSceneNode::setReloadEachFrame(bool val)
@@ -75,20 +75,20 @@ void STKMeshSceneNode::setReloadEachFrame(bool val)
immediate_draw = true;
}
void STKMeshSceneNode::createGLMeshes(RenderInfo* render_info)
void STKMeshSceneNode::createGLMeshes(RenderInfo* render_info, bool all_parts_colorized)
{
for (u32 i = 0; i<Mesh->getMeshBufferCount(); ++i)
{
scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i);
bool affected = false;
if (mb && render_info)
if (!all_parts_colorized && mb && render_info)
{
// Test if material is affected by hue change
affected = render_info->isColorizable(i);
}
GLmeshes.push_back(allocateMeshBuffer(mb, m_debug_name,
affected ? render_info : NULL));
affected || all_parts_colorized ? render_info : NULL));
}
isMaterialInitialized = false;
isGLInitialized = false;

View File

@@ -35,7 +35,7 @@ protected:
// Misc passes shaders (glow, displace...)
void drawGlow(const GLMesh &mesh);
void createGLMeshes(RenderInfo* render_info = NULL);
void createGLMeshes(RenderInfo* render_info = NULL, bool all_parts_colorized = false);
void cleanGLMeshes();
void setFirstTimeMaterial();
void updatevbo();
@@ -57,7 +57,7 @@ public:
const irr::core::vector3df& rotation = irr::core::vector3df(0, 0, 0),
const irr::core::vector3df& scale = irr::core::vector3df(1.0f, 1.0f, 1.0f),
bool createGLMeshes = true,
RenderInfo* render_info = NULL);
RenderInfo* render_info = NULL, bool all_parts_colorized = false);
virtual void render();
virtual void setMesh(irr::scene::IMesh* mesh);
virtual void OnRegisterSceneNode();

View File

@@ -459,7 +459,7 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool always_anim
{
if(!m_wheel_model[i]) continue;
m_wheel_node[i] = irr_driver->addMesh(m_wheel_model[i], "wheel",
node, getRenderInfo());
node, getRenderInfo(), true/*all_parts_colorized*/);
Vec3 wheel_min, wheel_max;
MeshTools::minMax3D(m_wheel_model[i], &wheel_min, &wheel_max);
m_wheel_graphics_radius[i] = 0.5f*(wheel_max.getY() - wheel_min.getY());
@@ -481,7 +481,8 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool always_anim
if(obj.m_model)
{
obj.m_node = irr_driver->addAnimatedMesh(obj.m_model,
"speedweighted", node, getRenderInfo());
"speedweighted", node, getRenderInfo(),
true/*all_parts_colorized*/);
obj.m_node->grab();
obj.m_node->setFrameLoop(m_animation_frame[AF_SPEED_WEIGHTED_START],