Revision: 14424
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14424
Author:   ben2610
Date:     2008-04-14 22:54:20 +0200 (Mon, 14 Apr 2008)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Camera.h
    trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp   
2008-04-14 20:50:40 UTC (rev 14423)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp   
2008-04-14 20:54:20 UTC (rev 14424)
@@ -684,15 +684,11 @@
                                                break;
                                        }
                                case ACT_SCENE_CAMERA:
+                                       mode = 
KX_SceneActuator::KX_SCENE_SET_CAMERA;
                                        if (sceneact->camera)
                                        {
-                                               mode = 
KX_SceneActuator::KX_SCENE_SET_CAMERA;
                                                cam = (KX_Camera*) 
converter->FindGameObject(sceneact->camera);
                                        }
-                                       else
-                                       {
-                                               // TODO:warn user
-                                       }
                                        break;
                                case ACT_SCENE_RESTART:
                                        {

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp        2008-04-14 
20:50:40 UTC (rev 14423)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.cpp        2008-04-14 
20:54:20 UTC (rev 14424)
@@ -69,7 +69,22 @@
 }      
 
 
+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;

Modified: trunk/blender/source/gameengine/Ketsji/KX_Camera.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Camera.h  2008-04-14 20:50:40 UTC 
(rev 14423)
+++ trunk/blender/source/gameengine/Ketsji/KX_Camera.h  2008-04-14 20:54:20 UTC 
(rev 14424)
@@ -134,6 +134,24 @@
        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;
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp 2008-04-14 
20:50:40 UTC (rev 14423)
+++ trunk/blender/source/gameengine/Ketsji/KX_SceneActuator.cpp 2008-04-14 
20:54:20 UTC (rev 14424)
@@ -105,6 +105,15 @@
                {
                        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;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to