Allow creating initially hidden objects, that can later be shown through scripting
This commit is contained in:
parent
b3cc5f9f0d
commit
403d61e754
@ -144,6 +144,7 @@ PhysicalObject::PhysicalObject(bool is_dynamic,
|
|||||||
m_reset_height = settings.m_reset_height;
|
m_reset_height = settings.m_reset_height;
|
||||||
m_on_kart_collision = settings.m_on_kart_collision;
|
m_on_kart_collision = settings.m_on_kart_collision;
|
||||||
m_on_item_collision = settings.m_on_item_collision;
|
m_on_item_collision = settings.m_on_item_collision;
|
||||||
|
m_body_added = false;
|
||||||
|
|
||||||
m_init_pos.setIdentity();
|
m_init_pos.setIdentity();
|
||||||
Vec3 radHpr(m_init_hpr);
|
Vec3 radHpr(m_init_hpr);
|
||||||
@ -483,6 +484,7 @@ void PhysicalObject::init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
World::getWorld()->getPhysics()->addBody(m_body);
|
World::getWorld()->getPhysics()->addBody(m_body);
|
||||||
|
m_body_added = true;
|
||||||
if(m_triangle_mesh)
|
if(m_triangle_mesh)
|
||||||
m_triangle_mesh->setBody(m_body);
|
m_triangle_mesh->setBody(m_body);
|
||||||
} // init
|
} // init
|
||||||
@ -611,14 +613,22 @@ void PhysicalObject::setInteraction(std::string interaction){
|
|||||||
/** Remove body from physics dynamic world interaction type for object*/
|
/** Remove body from physics dynamic world interaction type for object*/
|
||||||
void PhysicalObject::removeBody()
|
void PhysicalObject::removeBody()
|
||||||
{
|
{
|
||||||
World::getWorld()->getPhysics()->removeBody(m_body);
|
if (m_body_added)
|
||||||
|
{
|
||||||
|
World::getWorld()->getPhysics()->removeBody(m_body);
|
||||||
|
m_body_added = false;
|
||||||
|
}
|
||||||
} // Remove body
|
} // Remove body
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
/** Add body to physics dynamic world */
|
/** Add body to physics dynamic world */
|
||||||
void PhysicalObject::addBody()
|
void PhysicalObject::addBody()
|
||||||
{
|
{
|
||||||
World::getWorld()->getPhysics()->addBody(m_body);
|
if (!m_body_added)
|
||||||
|
{
|
||||||
|
m_body_added = true;
|
||||||
|
World::getWorld()->getPhysics()->addBody(m_body);
|
||||||
|
}
|
||||||
} // Add body
|
} // Add body
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -113,6 +113,8 @@ private:
|
|||||||
/** The mass of this object. */
|
/** The mass of this object. */
|
||||||
float m_mass;
|
float m_mass;
|
||||||
|
|
||||||
|
bool m_body_added;
|
||||||
|
|
||||||
/** The pointer that is stored in the bullet rigid body back to
|
/** The pointer that is stored in the bullet rigid body back to
|
||||||
* this object. */
|
* this object. */
|
||||||
UserPointer m_user_pointer;
|
UserPointer m_user_pointer;
|
||||||
|
@ -133,6 +133,26 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
|
|
||||||
m_type = type;
|
m_type = type;
|
||||||
|
|
||||||
|
m_initially_visible = true;
|
||||||
|
std::string condition;
|
||||||
|
xml_node.get("if", &condition);
|
||||||
|
if (condition == "false")
|
||||||
|
{
|
||||||
|
m_initially_visible = false;
|
||||||
|
}
|
||||||
|
else if (condition.size() > 0)
|
||||||
|
{
|
||||||
|
unsigned char result = -1;
|
||||||
|
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
|
||||||
|
std::function<void(asIScriptContext*)> null_callback;
|
||||||
|
script_engine->runFunction("bool " + condition + "()", null_callback,
|
||||||
|
[&](asIScriptContext* ctx) { result = ctx->GetReturnByte(); });
|
||||||
|
|
||||||
|
if (result == 0)
|
||||||
|
m_initially_visible = false;
|
||||||
|
}
|
||||||
|
if (!m_initially_visible)
|
||||||
|
setEnabled(false);
|
||||||
|
|
||||||
if (xml_node.getName() == "particle-emitter")
|
if (xml_node.getName() == "particle-emitter")
|
||||||
{
|
{
|
||||||
@ -180,7 +200,7 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
scene::ISceneNode *glownode = NULL;
|
scene::ISceneNode *glownode = NULL;
|
||||||
|
bool is_movable = false;
|
||||||
if (lod_instance)
|
if (lod_instance)
|
||||||
{
|
{
|
||||||
m_type = "lod";
|
m_type = "lod";
|
||||||
@ -222,11 +242,7 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
node->setPosition(absTransform.getTranslation());
|
node->setPosition(absTransform.getTranslation());
|
||||||
node->setRotation(absTransform.getRotationDegrees());
|
node->setRotation(absTransform.getRotationDegrees());
|
||||||
node->setScale(absTransform.getScale());
|
node->setScale(absTransform.getScale());
|
||||||
|
is_movable = true;
|
||||||
if (parent_library != NULL)
|
|
||||||
{
|
|
||||||
parent_library->addMovableChild(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glownode = node;
|
glownode = node;
|
||||||
@ -243,6 +259,11 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
this);
|
this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_movable && parent_library != NULL)
|
||||||
|
{
|
||||||
|
parent_library->addMovableChild(this);
|
||||||
|
}
|
||||||
|
|
||||||
video::SColor glow;
|
video::SColor glow;
|
||||||
if (xml_node.get("glow", &glow) && glownode)
|
if (xml_node.get("glow", &glow) && glownode)
|
||||||
{
|
{
|
||||||
@ -273,26 +294,10 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
|
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
// some static meshes are conditional
|
if (!m_initially_visible)
|
||||||
std::string condition;
|
setEnabled(false);
|
||||||
xml_node.get("if", &condition);
|
if (parent_library != NULL && !parent_library->isEnabled())
|
||||||
if (condition == "false")
|
|
||||||
{
|
|
||||||
// TODO: doesn't work (in all cases), probably it's a bit too early, children are not loaded yet
|
|
||||||
setEnabled(false);
|
setEnabled(false);
|
||||||
}
|
|
||||||
else if (condition.size() > 0)
|
|
||||||
{
|
|
||||||
unsigned char result = -1;
|
|
||||||
Scripting::ScriptEngine* script_engine = World::getWorld()->getScriptEngine();
|
|
||||||
std::function<void(asIScriptContext*)> null_callback;
|
|
||||||
script_engine->runFunction("bool " + condition + "()", null_callback,
|
|
||||||
[&](asIScriptContext* ctx) { result = ctx->GetReturnByte(); });
|
|
||||||
|
|
||||||
// TODO: doesn't work (in all cases), probably it's a bit too early, children are not loaded yet
|
|
||||||
if (result == 0)
|
|
||||||
setEnabled(false);
|
|
||||||
}
|
|
||||||
} // TrackObject
|
} // TrackObject
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -324,16 +329,16 @@ void TrackObject::reset()
|
|||||||
*/
|
*/
|
||||||
void TrackObject::setEnabled(bool enabled)
|
void TrackObject::setEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
if (m_enabled == enabled)
|
//if (m_enabled == enabled)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
m_enabled = enabled;
|
m_enabled = enabled;
|
||||||
|
|
||||||
if (m_presentation != NULL)
|
if (m_presentation != NULL)
|
||||||
m_presentation->setEnable(m_enabled);
|
m_presentation->setEnable(m_enabled);
|
||||||
|
|
||||||
if (enabled)
|
//if (enabled)
|
||||||
reset(); // TODO: not sure why there is a reset here
|
// reset();
|
||||||
|
|
||||||
if (getType() == "mesh")
|
if (getType() == "mesh")
|
||||||
{
|
{
|
||||||
@ -353,6 +358,14 @@ void TrackObject::setEnabled(bool enabled)
|
|||||||
} // setEnable
|
} // setEnable
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void TrackObject::resetEnabled()
|
||||||
|
{
|
||||||
|
setEnabled(m_initially_visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void TrackObject::update(float dt)
|
void TrackObject::update(float dt)
|
||||||
{
|
{
|
||||||
if (m_presentation) m_presentation->update(dt);
|
if (m_presentation) m_presentation->update(dt);
|
||||||
@ -464,5 +477,7 @@ const core::vector3df& TrackObject::getScale() const
|
|||||||
|
|
||||||
void TrackObject::addMovableChild(TrackObject* child)
|
void TrackObject::addMovableChild(TrackObject* child)
|
||||||
{
|
{
|
||||||
|
if (!m_enabled)
|
||||||
|
child->setEnabled(false);
|
||||||
m_movable_children.push_back(child);
|
m_movable_children.push_back(child);
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,8 @@ protected:
|
|||||||
|
|
||||||
std::vector<TrackObject*> m_movable_children;
|
std::vector<TrackObject*> m_movable_children;
|
||||||
|
|
||||||
|
bool m_initially_visible = true;
|
||||||
|
|
||||||
void init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
void init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
||||||
ModelDefinitionLoader& model_def_loader,
|
ModelDefinitionLoader& model_def_loader,
|
||||||
TrackObject* parent_library);
|
TrackObject* parent_library);
|
||||||
@ -213,6 +215,8 @@ public:
|
|||||||
/* @} */
|
/* @} */
|
||||||
/* @} */
|
/* @} */
|
||||||
/* @} */
|
/* @} */
|
||||||
|
|
||||||
|
void resetEnabled();
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
ThreeDAnimation* getAnimator() { return m_animator; }
|
ThreeDAnimation* getAnimator() { return m_animator; }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -81,7 +81,7 @@ void TrackObjectManager::reset()
|
|||||||
for (TrackObject* curr : m_all_objects)
|
for (TrackObject* curr : m_all_objects)
|
||||||
{
|
{
|
||||||
curr->reset();
|
curr->reset();
|
||||||
curr->setEnabled(true);
|
curr->resetEnabled();
|
||||||
}
|
}
|
||||||
} // reset
|
} // reset
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user