00001 #include "GameObject.h"
00002 #include "Application.h"
00003
00004 int GameObject::s_nextID = 0;
00005
00006 int GameObject::getID() const
00007 {
00008 return m_ID;
00009 }
00010
00011 void GameObject::setID()
00012 {
00013 m_ID = s_nextID;
00014 ++s_nextID;
00015 }
00016
00017 GameObject::GameObject()
00018 {
00019 m_vector = Ogre::Vector3::ZERO;
00020 m_lastMotion = Ogre::Vector3::ZERO;
00021 m_moveSpeed = 1.0;
00022 m_sceneNode = 0;
00023 m_entity = 0;
00024 m_manual = 0;
00025 m_moveable = 1;
00026 m_restitution = 0.6f;
00027 m_friction = 0.6f;
00028 m_mass = 0.0f;
00029 m_collisionShape = 0;
00030 m_rigidBody = 0;
00031 m_billboardSet = 0;
00032 m_type = 0;
00033 setID();
00034 }
00035
00036 GameObject::~GameObject()
00037 {
00038 Application::getSingleton()->getObjectManager()->removeObject(this);
00039
00040 if (getEntity() != 0) getSceneNode()->detachObject(getEntity());
00041 if (getManual() != 0) getSceneNode()->detachObject(getManual());
00042
00043 if (getSceneNode()->numAttachedObjects() == 0 && getSceneNode()->numChildren() == 0)
00044 {
00045 try
00046 {
00047 Application::getSingleton()->getViewerManager()->destroySceneNode(getSceneNode());
00048 }
00049 catch (...)
00050 {
00051 try
00052 {
00053 Application::getSingleton()->getOverlayManager()->destroySceneNode(getSceneNode());
00054 }
00055 catch (...)
00056 {
00057
00058 }
00059 }
00060 }
00061 if (getEntity() != 0) Application::getSingleton()->getViewerManager()->destroyEntity(getEntity());
00062 if (getManual() != 0) Application::getSingleton()->getViewerManager()->destroyManualObject(getManual());
00063 }
00064
00065 void GameObject::setVector(const Ogre::Vector3& _val)
00066 {
00067 m_vector = _val;
00068 }
00069
00070 Ogre::Vector3& GameObject::getVector()
00071 {
00072 return m_vector;
00073 }
00074
00075 void GameObject::setAny()
00076 {
00077 if (m_entity != 0) m_entity->setUserAny(Ogre::Any(this));
00078 if (m_manual != 0) m_manual->setUserAny(Ogre::Any(this));
00079 if (m_sceneNode != 0) m_sceneNode->setUserAny(Ogre::Any(this));
00080 }
00081
00082 bool GameObject::move(Ogre::Real _time)
00083 {
00084 if (m_vector != Ogre::Vector3::ZERO)
00085 {
00086 Ogre::Real timeSinceLastFrame = Application::getSingleton()->getTimeSinceLastFrame();
00087
00088 Ogre::Real moveScale = m_moveSpeed * timeSinceLastFrame;
00089
00090 m_vector *= moveScale;
00091
00092 m_sceneNode->translate(m_vector, Ogre::Node::TS_WORLD);
00093
00094 m_lastMotion = m_vector;
00095 m_vector = Ogre::Vector3::ZERO;
00096 return true;
00097 }
00098
00099 return false;
00100 }
00101
00102 Ogre::SceneNode* GameObject::getSceneNode() const
00103 {
00104 return m_sceneNode;
00105 }
00106
00107 void GameObject::setSceneNode(Ogre::SceneNode* _val)
00108 {
00109 m_sceneNode = _val;
00110 setAny();
00111 }
00112
00113 Ogre::BillboardSet* GameObject::getBillboardSet() const
00114 {
00115 return m_billboardSet;
00116 }
00117
00118 void GameObject::setBillboardSet(Ogre::BillboardSet* _val)
00119 {
00120 m_billboardSet = _val;
00121
00122 if (getSceneNode() != 0)
00123 {
00124 getSceneNode()->attachObject(m_billboardSet);
00125 }
00126 }
00127
00128 Ogre::Entity* GameObject::getEntity() const
00129 {
00130 return m_entity;
00131 }
00132
00133 void GameObject::setEntity(Ogre::Entity* _val)
00134 {
00135
00136 if (m_entity != 0 && m_entity->isAttached())
00137 {
00138 m_entity->getParentSceneNode()->detachObject(m_entity);
00139 }
00140
00141 m_entity = _val;
00142
00143 setAny();
00144
00145
00146 if (getSceneNode() != 0)
00147 {
00148 getSceneNode()->attachObject(getEntity());
00149 }
00150 }
00151
00152
00153 std::string GameObject::getName() const
00154 {
00155 return m_name;
00156 }
00157
00158 void GameObject::setName(const std::string& _val)
00159 {
00160 m_name = _val;
00161 }
00162
00163 void GameObject::setMoveSpeed(const Ogre::Real& _val)
00164 {
00165 m_moveSpeed = _val;
00166 }
00167
00168 Ogre::Real& GameObject::getMoveSpeed()
00169 {
00170 return m_moveSpeed;
00171 }
00172
00173 void GameObject::setMoveable(const bool _val)
00174 {
00175 m_moveable = _val;
00176 }
00177
00178 bool GameObject::getMoveable() const
00179 {
00180 return m_moveable;
00181 }
00182
00183 Ogre::ManualObject* GameObject::getManual() const
00184 {
00185 return m_manual;
00186 }
00187
00188 void GameObject::setManual(Ogre::ManualObject* _val)
00189 {
00190 m_manual = _val;
00191 }
00192
00193 bool GameObject::makePhysical()
00194 {
00195 m_physical = false;
00196 if (getEntity() != 0)
00197 {
00198 Ogre::Vector3 physicalSize = Ogre::Vector3::ZERO;
00199 Ogre::AxisAlignedBox boundingBox = getEntity()->getBoundingBox();
00200 physicalSize = boundingBox.getSize() * 0.5f;
00201
00202
00203
00204 physicalSize *= 0.96f;
00205
00206
00207 physicalSize *= getScale();
00208
00209
00210 m_collisionShape = Application::getSingleton()->getPhysicsManager()->createCollisionShape(0.5f,0.5f,Ogre::Vector3::UNIT_Z);
00211
00212
00213 m_rigidBody = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "rigidBody");
00214
00215 Ogre::Vector3 pos = getSceneNode()->getPosition();
00216 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00217 m_rigidBody->setShape(getSceneNode(),m_collisionShape,m_restitution,m_friction,m_mass,pos,quat);
00218
00219 Application::getSingleton()->getPhysicsManager()->addPair(m_rigidBody,m_collisionShape);
00220
00221 m_physical = true;
00222 }
00223 return m_physical;
00224 }
00225
00226 bool GameObject::makePhysicalConcave()
00227 {
00228 bool ret = false;
00229
00230 if (getEntity() != 0)
00231 {
00232 Ogre::Vector3 physicalSize = Ogre::Vector3::ZERO;
00233 Ogre::AxisAlignedBox boundingBox = getEntity()->getBoundingBox();
00234
00235
00236 m_collisionShape = Application::getSingleton()->getPhysicsManager()->createCollisionShape(getEntity());
00237
00238
00239 m_rigidBody = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "rigidBody");
00240
00241 Ogre::Vector3 pos = getSceneNode()->getPosition();
00242 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00243 m_rigidBody->setShape(getSceneNode(),m_collisionShape,m_restitution,m_friction,m_mass,pos,quat);
00244
00245 Application::getSingleton()->getPhysicsManager()->addPair(m_rigidBody,m_collisionShape);
00246
00247 m_rigidBody->getBulletRigidBody()->setUserPointer((void*)this);
00248
00249 ret = true;
00250 }
00251
00252 return ret;
00253 }
00254 bool GameObject::getPhysical()
00255 {
00256 return m_physical;
00257 }
00258
00259 void GameObject::setScale(const Ogre::Real& _val)
00260 {
00261 m_scale = _val;
00262 if (getSceneNode() != 0)
00263 {
00264 getSceneNode()->setScale(Ogre::Vector3(_val,_val,_val));
00265 }
00266 }
00267
00268 Ogre::Real& GameObject::getScale()
00269 {
00270 return m_scale;
00271 }
00272
00273 void GameObject::setCollisionShape(OgreBulletCollisions::CollisionShape* _val)
00274 {
00275 m_collisionShape = _val;
00276 }
00277
00278 OgreBulletCollisions::CollisionShape* GameObject::getCollisionShape()
00279 {
00280 return m_collisionShape;
00281 }
00282
00283 void GameObject::setRigidBody(OgreBulletDynamics::RigidBody *_val)
00284 {
00285 m_rigidBody = _val;
00286 }
00287
00288 OgreBulletDynamics::RigidBody* GameObject::getRigidBody()
00289 {
00290 return m_rigidBody;
00291 }
00292
00293 void GameObject::setRestitution(const Ogre::Real& _val)
00294 {
00295 m_restitution = _val;
00296 }
00297
00298 Ogre::Real GameObject::getRestitution() const
00299 {
00300 return m_restitution;
00301 }
00302
00303 void GameObject::setFriction(const Ogre::Real& _val)
00304 {
00305 m_friction = _val;
00306 }
00307
00308 Ogre::Real GameObject::getFriction() const
00309 {
00310 return m_friction;
00311 }
00312
00313 void GameObject::setMass(const Ogre::Real& _val)
00314 {
00315 m_mass = _val;
00316 }
00317
00318 Ogre::Real GameObject::getMass() const
00319 {
00320 return m_mass;
00321 }
00322
00323 int GameObject::getType()
00324 {
00325 return m_type;
00326 }