Allow sharing headlight model and config its color (for gnu)
This commit is contained in:
parent
00660293b7
commit
12188c5287
@ -547,7 +547,7 @@ void KartGFX::setGFXInvisible()
|
||||
m_nitro_light->setVisible(false);
|
||||
m_skidding_light_1->setVisible(false);
|
||||
m_skidding_light_2->setVisible(false);
|
||||
m_kart->getKartModel()->turnOffHeadlights();
|
||||
m_kart->getKartModel()->toggleHeadlights(false);
|
||||
}
|
||||
#endif
|
||||
} // setGFXInvisible
|
||||
|
@ -284,16 +284,20 @@ KartModel::~KartModel()
|
||||
for (size_t i = 0; i < m_headlight_objects.size(); i++)
|
||||
{
|
||||
HeadlightObject& obj = m_headlight_objects[i];
|
||||
if (obj.getNode())
|
||||
if (obj.getLightNode())
|
||||
{
|
||||
// Master KartModels should never have a headlight attached.
|
||||
assert(!m_is_master);
|
||||
obj.getNode()->drop();
|
||||
obj.getLightNode()->drop();
|
||||
}
|
||||
if (m_is_master && obj.getModel())
|
||||
{
|
||||
obj.getModel()->drop();
|
||||
irr_driver->dropAllTextures(obj.getModel());
|
||||
irr_driver->removeMeshFromCache(obj.getModel());
|
||||
if (obj.getModel()->getReferenceCount() == 1)
|
||||
{
|
||||
irr_driver->removeMeshFromCache(obj.getModel());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -386,7 +390,7 @@ KartModel* KartModel::makeCopy(KartRenderType krt)
|
||||
for (size_t i = 0; i<m_headlight_objects.size(); i++)
|
||||
{
|
||||
// Master should not have any headlight nodes.
|
||||
assert(!m_headlight_objects[i].getNode());
|
||||
assert(!m_headlight_objects[i].getLightNode());
|
||||
km->m_headlight_objects[i] = m_headlight_objects[i];
|
||||
}
|
||||
|
||||
@ -551,19 +555,16 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool human_playe
|
||||
m_animated_node && !obj.getBoneName().empty();
|
||||
scene::ISceneNode* parent = bone_attachment ?
|
||||
m_animated_node->getJointNode(obj.getBoneName().c_str()) : node;
|
||||
scene::ISceneNode* new_node =
|
||||
scene::ISceneNode* headlight_model =
|
||||
irr_driver->addMesh(obj.getModel(), "kart_headlight",
|
||||
parent, getRenderInfo());
|
||||
#ifndef SERVER_ONLY
|
||||
if (human_player && CVS->isGLSL() && CVS->isDefferedEnabled())
|
||||
{
|
||||
obj.setNode(irr_driver->addLight(core::vector3df
|
||||
(0.0f, 0.0f, 0.0f), each_energy, each_radius,
|
||||
1.0f, 1.0f, 1.0f, false, new_node));
|
||||
obj.getNode()->grab();
|
||||
obj.setLight(headlight_model, each_energy, each_radius);
|
||||
}
|
||||
#endif
|
||||
configNode(new_node, obj.getLocation(), bone_attachment ?
|
||||
configNode(headlight_model, obj.getLocation(), bone_attachment ?
|
||||
getInverseBoneMatrix(obj.getBoneName().c_str()) : core::matrix4());
|
||||
}
|
||||
}
|
||||
@ -583,6 +584,18 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool human_playe
|
||||
return node;
|
||||
} // attachModel
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Add a light node emitted from the center mass the headlight.
|
||||
*/
|
||||
void HeadlightObject::setLight(scene::ISceneNode* parent,
|
||||
float energy, float radius)
|
||||
{
|
||||
m_node = irr_driver->addLight(core::vector3df(0.0f, 0.0f, 0.0f),
|
||||
energy, radius, m_headlight_color.getRed() / 255.f,
|
||||
m_headlight_color.getGreen() / 255.f,
|
||||
m_headlight_color.getBlue() / 255.f, false/*sun*/, parent);
|
||||
m_node->grab();
|
||||
} // setLight
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Loads the 3d model and all wheels.
|
||||
@ -682,6 +695,7 @@ bool KartModel::loadModels(const KartProperties &kart_properties)
|
||||
HeadlightObject& obj = m_headlight_objects[i];
|
||||
std::string full_name = kart_properties.getKartDir() + obj.getFilename();
|
||||
obj.setModel(irr_driver->getMesh(full_name));
|
||||
obj.getModel()->grab();
|
||||
irr_driver->grabAllTextures(obj.getModel());
|
||||
}
|
||||
|
||||
@ -813,7 +827,10 @@ void KartModel::loadHeadlights(const XMLNode &node)
|
||||
child->get("bone", &bone_name);
|
||||
std::string model;
|
||||
child->get("model", &model);
|
||||
m_headlight_objects.push_back(HeadlightObject(model, location, bone_name));
|
||||
video::SColor headlight_color(-1);
|
||||
child->get("color", &headlight_color);
|
||||
m_headlight_objects.push_back(HeadlightObject(model, location,
|
||||
bone_name, headlight_color));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -846,14 +863,7 @@ void KartModel::reset()
|
||||
if (lod)
|
||||
lod->forceLevelOfDetail(-1);
|
||||
|
||||
for (unsigned int i = 0; i < m_headlight_objects.size(); i++)
|
||||
{
|
||||
HeadlightObject& obj = m_headlight_objects[i];
|
||||
if (obj.getNode())
|
||||
{
|
||||
obj.getNode()->setVisible(true);
|
||||
}
|
||||
}
|
||||
toggleHeadlights(true);
|
||||
} // reset
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -1176,17 +1186,17 @@ RenderInfo* KartModel::getRenderInfo()
|
||||
} // getRenderInfo
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
void KartModel::turnOffHeadlights()
|
||||
void KartModel::toggleHeadlights(bool on)
|
||||
{
|
||||
for (unsigned int i = 0; i < m_headlight_objects.size(); i++)
|
||||
{
|
||||
HeadlightObject& obj = m_headlight_objects[i];
|
||||
if (obj.getNode())
|
||||
if (obj.getLightNode())
|
||||
{
|
||||
obj.getNode()->setVisible(false);
|
||||
obj.getLightNode()->setVisible(on);
|
||||
}
|
||||
}
|
||||
} // turnOffHeadlights
|
||||
} // toggleHeadlights
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
core::matrix4 KartModel::getInverseBoneMatrix(const char* bone_name)
|
||||
|
@ -92,14 +92,21 @@ class HeadlightObject
|
||||
private:
|
||||
/** The filename of the headlight model. */
|
||||
std::string m_filename;
|
||||
|
||||
/** The relative matrix to the parent kart scene node
|
||||
* or bone where the headlight mesh is attached to. */
|
||||
core::matrix4 m_location;
|
||||
|
||||
/** The mesh for the headlight. */
|
||||
scene::IMesh* m_model;
|
||||
/** The scene node of the headlight. */
|
||||
|
||||
/** The scene node of the headlight (real light). */
|
||||
scene::ISceneNode* m_node;
|
||||
|
||||
/** The color of the real light. */
|
||||
video::SColor m_headlight_color;
|
||||
|
||||
/** Attach to which bone in kart model if not empty. */
|
||||
std::string m_bone_name;
|
||||
|
||||
public:
|
||||
@ -111,13 +118,14 @@ public:
|
||||
} // HeadlightObject
|
||||
// ------------------------------------------------------------------------
|
||||
HeadlightObject(const std::string& filename, const core::matrix4& location,
|
||||
const std::string& bone_name)
|
||||
const std::string& bone_name, const video::SColor& color)
|
||||
{
|
||||
m_filename = filename;
|
||||
m_location = location;
|
||||
m_model = NULL;
|
||||
m_node = NULL;
|
||||
m_bone_name = bone_name;
|
||||
m_headlight_color = color;
|
||||
} // HeadlightObjects
|
||||
// ------------------------------------------------------------------------
|
||||
const std::string& getFilename() const { return m_filename; }
|
||||
@ -125,15 +133,11 @@ public:
|
||||
/** Sets the mesh for this headlight object. */
|
||||
void setModel(scene::IMesh *mesh) { m_model = mesh; }
|
||||
// ------------------------------------------------------------------------
|
||||
/** Sets the node of the headlight. */
|
||||
void setNode(scene::ISceneNode *node)
|
||||
{
|
||||
m_node = node;
|
||||
} // setNode
|
||||
void setLight(scene::ISceneNode* parent, float energy, float radius);
|
||||
// ------------------------------------------------------------------------
|
||||
const scene::ISceneNode *getNode() const { return m_node; }
|
||||
const scene::ISceneNode *getLightNode() const { return m_node; }
|
||||
// ------------------------------------------------------------------------
|
||||
scene::ISceneNode *getNode() { return m_node; }
|
||||
scene::ISceneNode *getLightNode() { return m_node; }
|
||||
// ------------------------------------------------------------------------
|
||||
const scene::IMesh *getModel() const { return m_model; }
|
||||
// ------------------------------------------------------------------------
|
||||
@ -433,7 +437,7 @@ public:
|
||||
// ------------------------------------------------------------------------
|
||||
bool supportColorization() const { return m_support_colorization; }
|
||||
// ------------------------------------------------------------------------
|
||||
void turnOffHeadlights();
|
||||
void toggleHeadlights(bool on);
|
||||
|
||||
}; // KartModel
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user