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.
This commit is contained in:
parent
0b8b4369c9
commit
566053319a
@ -684,15 +684,11 @@ void BL_ConvertActuators(char* maggiename,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ACT_SCENE_CAMERA:
|
case ACT_SCENE_CAMERA:
|
||||||
|
mode = KX_SceneActuator::KX_SCENE_SET_CAMERA;
|
||||||
if (sceneact->camera)
|
if (sceneact->camera)
|
||||||
{
|
{
|
||||||
mode = KX_SceneActuator::KX_SCENE_SET_CAMERA;
|
|
||||||
cam = (KX_Camera*) converter->FindGameObject(sceneact->camera);
|
cam = (KX_Camera*) converter->FindGameObject(sceneact->camera);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO:warn user
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ACT_SCENE_RESTART:
|
case ACT_SCENE_RESTART:
|
||||||
{
|
{
|
||||||
|
@ -69,6 +69,21 @@ 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 KX_Camera::GetWorldToCamera() const
|
||||||
{
|
{
|
||||||
|
@ -134,6 +134,24 @@ public:
|
|||||||
KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, PyTypeObject *T = &Type);
|
KX_Camera(void* sgReplicationInfo,SG_Callbacks callbacks,const RAS_CameraData& camdata, bool frustum_culling = true, PyTypeObject *T = &Type);
|
||||||
virtual ~KX_Camera();
|
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 GetWorldToCamera() const;
|
||||||
MT_Transform GetCameraToWorld() const;
|
MT_Transform GetCameraToWorld() const;
|
||||||
|
|
||||||
|
@ -105,6 +105,15 @@ bool KX_SceneActuator::Update()
|
|||||||
{
|
{
|
||||||
m_scene->SetActiveCamera(m_camera);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user