43 CGameObject::CGameObject() :
CLNode() {
66 if (
this == &original_obj)
80 setProperty(
"objectName", original_obj.property(
"objectName"));
83 bulletProperties = original_obj.bulletProperties;
85 m_tag = original_obj.tag();
87 setDynamicProperties(original_obj.dynamicProperties());
92 void CGameObject::setActionManager(
CActionManager* action_manager) {
109 void CGameObject::setName(
const std::string& name) {
110 setProperty(
"objectName", QString::fromStdString(name));
115 std::string CGameObject::name()
const {
116 return property(
"objectName").toString().toStdString();
127 void CGameObject::setPosition(
const btVector3 &value) {
133 void CGameObject::setPosition(
float x,
float y,
float z) {
134 setPosition(btVector3(x, y, z));
139 const btVector3 CGameObject::scale() {
145 void CGameObject::setScale(btVector3 &scale) {
151 void CGameObject::setScale(
float x,
float y,
float z) {
152 setScale(btVector3(x, y, z));
157 void CGameObject::setScale(
float _scale) {
158 setScale(btVector3(scale().x() * _scale,
159 scale().y() * _scale,
160 scale().z() * _scale));
165 btVector3 CGameObject::rotation() {
166 btScalar yaw = 0.0f, pitch = 0.0f, roll = 0.0f;
173 btQuaternion CGameObject::rotationQuat() {
179 void CGameObject::setRotation(
const btVector3 &vec_rotation) {
180 btQuaternion rotation = btQuaternion(
184 rotation.normalize();
190 void CGameObject::setRotation(
const btQuaternion& rotation) {
196 void CGameObject::setRotation(
float x,
float y,
float z) {
197 setRotation(btVector3(x, y, z));
202 void CGameObject::setRotation(
float w,
float x,
float y,
float z) {
203 setRotation(btQuaternion(w, x, y, z));
208 const QList<QProperty> CGameObject::dynamicProperties()
const {
209 QList<QProperty> dynamic_properties = QList<QProperty>();
210 QList<QByteArray> prop_names = dynamicPropertyNames();
211 QListIterator<QByteArray> it(prop_names);
212 while (it.hasNext()) {
213 QByteArray name = it.next();
214 dynamic_properties.append(
QProperty(QString(name), property(qPrintable(name))));
216 return dynamic_properties;
221 void CGameObject::setDynamicProperties(QList<QProperty> dynamic_properties) {
222 QListIterator<QProperty> it(dynamic_properties);
223 while (it.hasNext()) {
225 setProperty(qPrintable(property.objectName()), property.value());
232 return m_CObjectType;
237 void CGameObject::setCObjectType(
int val) {
243 const QString& CGameObject::CObjectTypeName()
const {
249 void CGameObject::setCObjectTypeName(
const QString& type_name) {
255 unsigned int CGameObject::uid()
const {
261 const bool CGameObject::bPhysicsEnabled()
const {
267 void CGameObject::setbPhysicsEnabled(
bool physics_enabled) {
273 const float CGameObject::bMass()
const {
274 return bulletProperties.
mass();
279 void CGameObject::setbMass(
float mass) {
280 bulletProperties.
setMass(mass);
285 const float CGameObject::bRestitution()
const {
291 void CGameObject::setbRestitution(
float restitution) {
297 const float CGameObject::bFriction()
const {
301 void CGameObject::setbFriction(
float friction) {
305 const btVector3& CGameObject::bLinearFactor()
const {
311 void CGameObject::setbLinearFactor(
const btVector3 &linear_factor) {
317 const btVector3& CGameObject::bAngularFactor()
const {
323 void CGameObject::setbAngularFactor(
const btVector3 &angular_factor) {
341 const float CGameObject::bShapeTypeRadius()
const {
342 return bulletProperties.
radius();
347 void CGameObject::setbShapeTypeRadius(
float radius) {
353 const float CGameObject::bShapeTypeHeight()
const {
354 return bulletProperties.
height();
359 void CGameObject::setbShapeTypeHeight(
float height) {
365 const btVector3 CGameObject::bShapeTypeSize()
const {
366 return bulletProperties.
size();
371 void CGameObject::setbShapeTypeSize(btVector3 &size) {
372 bulletProperties.
setSize(size);
377 const QString CGameObject::bShapeTypeVertices()
const {
383 void CGameObject::setbShapeTypeVertices(QString vertices) {
389 const btVector3 CGameObject::bShapeTypePlaneNormal()
const {
395 void CGameObject::setbShapeTypePlaneNormal(btVector3 &plane_normal) {
401 const float CGameObject::bShapeTypePlaneConstant()
const {
407 void CGameObject::setbShapeTypePlaneConstant(
float plane_constant) {
425 btCollisionShape* CGameObject::collisionShape() {
426 QVariant value = property(
"ShapeType_Size");
427 btVector3 size = *
static_cast<btVector3*
>(value.data());
428 btVector3 bt_size = btVector3(size.x(), size.y(), size.z());
430 value = property(
"ShapeType_PlaneNormal");
431 size = *
static_cast<btVector3*
>(value.data());
432 btVector3 plane_normal = btVector3(size.x(), size.y(), size.z());
434 float radius = property(
"ShapeType_Radius").toFloat();
435 float height = property(
"ShapeType_Height").toFloat();
436 float plane_constant = property(
"ShapeType_PlaneConstant").toFloat();
438 QString vertices_str = property(
"ShapeType_Vertices").toString();
439 std::vector<std::string> vertices_vec =
StringHelper::split(vertices_str.toStdString(),
" ");
440 std::vector<float> fixed_vertices_vec;
441 for (std::vector<std::string>::iterator it = vertices_vec.begin();
442 it != vertices_vec.end();
445 float converted = strtol((*it).c_str(), &p, 10);
447 fixed_vertices_vec.push_back(0);
449 fixed_vertices_vec.push_back(converted);
452 int vertices_count = fixed_vertices_vec.size();
453 btScalar* vertices =
new btScalar[vertices_count];
454 for (
unsigned int i = 0; i < fixed_vertices_vec.size(); i++) {
455 vertices[i] = fixed_vertices_vec[i];
458 btCollisionShape* collision_shape = NULL;
461 collision_shape =
new btBoxShape(bt_size);
464 collision_shape =
new btSphereShape(radius);
467 collision_shape =
new btStaticPlaneShape(plane_normal, plane_constant);
470 collision_shape =
new btConeShape(radius, height);
473 collision_shape =
new btCapsuleShape(radius, height);
476 collision_shape =
new btCylinderShape(bt_size);
479 collision_shape =
new btConvexHullShape(vertices, vertices_count);
487 return collision_shape;
492 CGameScene* CGameObject::parentScene()
const {
493 QObject* _parent = parent();
496 bool is_game_scene = (qobject_cast<
CGameScene*>(_parent) != NULL);
500 _parent = _parent->parent();
504 return reinterpret_cast<CGameScene*
>(_parent);
509 void CGameObject::start() {
514 void CGameObject::preUpdate() {
519 void CGameObject::update() {
524 void CGameObject::postWorldUpdate() {
529 void CGameObject::postUpdate() {
534 void CGameObject::runAction(
CAction* action) {
541 void CGameObject::stopAllActions() {
547 void CGameObject::stopAction(
CAction* action) {
553 void CGameObject::stopActionByTag(
unsigned int a_tag) {
560 CAction* CGameObject::getActionByTag(
unsigned int a_tag) {
567 unsigned int CGameObject::numberOfRunningActions() {
573 void CGameObject::deployIntoDynamicsWorld() {
580 btCollisionShape* collision_shape = collisionShape();
586 btDefaultMotionState* motion_state =
new btDefaultMotionState(_transform.
getInnerTransform());
587 btRigidBody::btRigidBodyConstructionInfo rigid_body_ci(bulletProperties.
mass(),
590 rigid_body_ci.m_restitution = property(
"Restitution").toFloat();
591 rigid_body_ci.m_friction = property(
"Friction").toFloat();
592 btRigidBody* rigid_body =
new btRigidBody(rigid_body_ci);
593 rigid_body->setUserPointer(
this);
603 void CGameObject::removeFromDynamicsWorld() {
604 btRigidBody* body = bulletProperties.
rigidBody();
621 void CGameObject::updateBulletProperties() {
622 btVector3 fixed_size =
m_size * k_QGLGameEditorViewport_SizeFactor * 0.5f;
623 float largest_axis = std::max(std::max(fixed_size.x(), fixed_size.y()), fixed_size.z());
625 setbShapeTypeRadius(largest_axis);
626 setbShapeTypeSize(fixed_size);
627 setbShapeTypeHeight(fixed_size.y());
632 int CGameObject::tag()
const {
638 void CGameObject::setTag(
int tag) {
644 const btVector3& CGameObject::calcSize() {
646 updateBulletProperties();
655 child->setParent(
this);
660 void CGameObject::onCollisionWithObject(
CGameObject*
object) {
665 void CGameObject::aboutToBeRemoved() {
670 void CGameObject::remove() {
677 CGameObject::~CGameObject(
void) {
678 removeFromDynamicsWorld();
680 std::vector<CGameObject*>* gameobjs_to_remove =
new std::vector<CGameObject*>();
681 for (QList<QObject*>::const_iterator it = children().begin();
682 it != children().end();
684 if (qobject_cast<CGameObject*>(*it) != NULL) {
686 game_obj->stopAllActions();
688 gameobjs_to_remove->push_back(game_obj);
void removeAction(CAction *action)
const float planeConstant() const
static const QStringList & types()
void removeActionByTag(unsigned int tag, CGameObject *target)
void copyNodeValuesFromNode(CLNode *node)
void setPhysicsEnabled(bool physics_enabled)
void setFriction(float friction)
void setRadius(float radius)
virtual const btVector3 & calcSize()
void setRigidBody(btRigidBody *rigid_body)
const float height() const
const btVector3 & linearFactor() const
static void deleteVector(std::vector< T * > *vec)
const ShapeTypes shapeType() const
const float friction() const
virtual void copyValuesFromObject(const CGameObject &game_object)
void setLinearFactor(const btVector3 &linear_factor)
btDiscreteDynamicsWorld * dynamicsWorld() const
const QString & vertices() const
void setPlaneNormal(const btVector3 &plane_normal)
unsigned int numberOfRunningActionsInTarget(CGameObject *target)
static unsigned int nextUID()
void setHeight(float height)
void setPlaneConstant(float plane_constant)
const Transform & constTransform() const
void setShapeType(ShapeTypes shape_type)
void setVertices(const QString &vertices)
CActionManager * m_actionManager
const float restitution() const
CAction * getActionByTag(unsigned int tag, CGameObject *game_object)
const float radius() const
const bool physicsEnabled() const
const btVector3 & size() const
static int getObjectTypeId(const char *class_name)
const btVector3 & angularFactor() const
void setAngularFactor(const btVector3 &angular_factor)
void addAction(CAction *action, CGameObject *target, bool paused)
void setSize(const btVector3 &size)
btRigidBody * rigidBody() const
void removeAllActionsFromTarget(CGameObject *target)
const btVector3 & planeNormal() const
static const QString & getTypeNameHavingId(int type_id)
void setActivationState(const CBulletProperties::ActivationState &activationState)
void removeGameObjectWhenAble(CGameObject *game_object)
static std::vector< std::string > split(const std::string &str, const std::string &delimiters)
CBulletProperties::ActivationState activationState() const
void setRestitution(float restitution)