diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2008-04-15 00:54:20 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2008-04-15 00:54:20 +0400 |
commit | 566053319a47119bf718154f800659f9f0b86472 (patch) | |
tree | decf82225fcbd22e9c7f937b53af02b4ad04911c /source/gameengine/Ketsji | |
parent | 0b8b4369c9dbfd9f0048b54a74bf3669919e7f0f (diff) |
fix BGE bug #8309: After Parent Object added to the visual layer, Child Camera won't follow.
This bug fix is made of two parts:
1) It's now possible to dynamically add a camera.
2) Empty camera name on a SetCamera actuator now points to the actuator's parent object if this object is a camera.
This trick is useful to make current a dynamically created camera: just add a SetCamera actuator on the camera itself and leave the name empty. Later, when the camera is added in the scene with an AddObject actuator, either directly or via a parent object, you just need to activate the actuator to make the newly created camera current. If you set a name on a SetCamera actuator, it will always point to the original camera, even after replication.
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_Camera.cpp | 15 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Camera.h | 18 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SceneActuator.cpp | 9 |
3 files changed, 42 insertions, 0 deletions
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp index b75662f01c9..aa15199b816 100644 --- a/source/gameengine/Ketsji/KX_Camera.cpp +++ b/source/gameengine/Ketsji/KX_Camera.cpp @@ -69,7 +69,22 @@ KX_Camera::~KX_Camera() } +CValue* KX_Camera::GetReplica() +{ + KX_Camera* replica = new KX_Camera(*this); + + // this will copy properties and so on... + CValue::AddDataToReplica(replica); + ProcessReplica(replica); + + return replica; +} +void KX_Camera::ProcessReplica(KX_Camera* replica) +{ + KX_GameObject::ProcessReplica(replica); +} + MT_Transform KX_Camera::GetWorldToCamera() const { MT_Transform camtrans; diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h index 34a3d2f2653..08f2bf3d1c1 100644 --- a/source/gameengine/Ketsji/KX_Camera.h +++ b/source/gameengine/Ketsji/KX_Camera.h @@ -134,6 +134,24 @@ public: KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, PyTypeObject *T = &Type); virtual ~KX_Camera(); + /** + * Inherited from CValue -- return a new copy of this + * instance allocated on the heap. Ownership of the new + * object belongs with the caller. + */ + virtual CValue* + GetReplica( + ); + + /** + * Inherited from CValue -- Makes sure any internal + * data owned by this class is deep copied. Called internally + */ + virtual void + ProcessReplica( + KX_Camera* replica + ); + MT_Transform GetWorldToCamera() const; MT_Transform GetCameraToWorld() const; diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp index a37fce434be..7a9d144e92f 100644 --- a/source/gameengine/Ketsji/KX_SceneActuator.cpp +++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp @@ -105,6 +105,15 @@ bool KX_SceneActuator::Update() { m_scene->SetActiveCamera(m_camera); } + else + { + // if no camera is set and the parent object is a camera, use it as the camera + SCA_IObject* parent = GetParent(); + if (parent->isA(&KX_Camera::Type)) + { + m_scene->SetActiveCamera((KX_Camera*)parent); + } + } break; default: break; |