2 * Set scene/camera stuff
5 * ***** BEGIN GPL LICENSE BLOCK *****
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
22 * All rights reserved.
24 * The Original Code is: all of this file.
26 * Contributor(s): none yet.
28 * ***** END GPL LICENSE BLOCK *****
31 /** \file gameengine/Ketsji/KX_SceneActuator.cpp
36 #include "SCA_IActuator.h"
37 #include "KX_SceneActuator.h"
40 #include "KX_Camera.h"
41 #include "KX_KetsjiEngine.h"
43 /* ------------------------------------------------------------------------- */
44 /* Native functions */
45 /* ------------------------------------------------------------------------- */
47 KX_SceneActuator::KX_SceneActuator(SCA_IObject *gameobj,
50 KX_KetsjiEngine* ketsjiEngine,
51 const STR_String& nextSceneName,
53 : SCA_IActuator(gameobj, KX_ACT_SCENE)
57 m_KetsjiEngine=ketsjiEngine;
59 m_nextSceneName = nextSceneName;
61 m_camera->RegisterActuator(this);
62 } /* End of constructor */
66 KX_SceneActuator::~KX_SceneActuator()
69 m_camera->UnregisterActuator(this);
70 } /* end of destructor */
74 CValue* KX_SceneActuator::GetReplica()
76 KX_SceneActuator* replica = new KX_SceneActuator(*this);
77 replica->ProcessReplica();
81 void KX_SceneActuator::ProcessReplica()
84 m_camera->RegisterActuator(this);
85 SCA_IActuator::ProcessReplica();
88 bool KX_SceneActuator::UnlinkObject(SCA_IObject* clientobj)
90 if (clientobj == (SCA_IObject*)m_camera)
92 // this object is being deleted, we cannot continue to track it.
99 void KX_SceneActuator::Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map)
101 void **h_obj = (*obj_map)[m_camera];
104 m_camera->UnregisterActuator(this);
105 m_camera = (KX_Camera*)(*h_obj);
106 m_camera->RegisterActuator(this);
111 bool KX_SceneActuator::Update()
113 // bool result = false; /*unused*/
114 bool bNegativeEvent = IsNegativeEvent();
118 return false; // do nothing on negative events
122 case KX_SCENE_RESTART:
124 m_KetsjiEngine->ReplaceScene(m_scene->GetName(),m_scene->GetName());
127 case KX_SCENE_SET_CAMERA:
130 m_scene->SetActiveCamera(m_camera);
134 // if no camera is set and the parent object is a camera, use it as the camera
135 SCA_IObject* parent = GetParent();
136 if (parent->GetGameObjectType()==SCA_IObject::OBJ_CAMERA)
138 m_scene->SetActiveCamera((KX_Camera*)parent);
146 if (!m_nextSceneName.Length())
151 case KX_SCENE_SET_SCENE:
153 m_KetsjiEngine->ReplaceScene(m_scene->GetName(),m_nextSceneName);
156 case KX_SCENE_ADD_FRONT_SCENE:
159 m_KetsjiEngine->ConvertAndAddScene(m_nextSceneName,overlay);
162 case KX_SCENE_ADD_BACK_SCENE:
165 m_KetsjiEngine->ConvertAndAddScene(m_nextSceneName,overlay);
168 case KX_SCENE_REMOVE_SCENE:
170 m_KetsjiEngine->RemoveScene(m_nextSceneName);
173 case KX_SCENE_SUSPEND:
175 m_KetsjiEngine->SuspendScene(m_nextSceneName);
178 case KX_SCENE_RESUME:
180 m_KetsjiEngine->ResumeScene(m_nextSceneName);
184 ; /* do nothing? this is an internal error !!! */
192 /* returns a camera if the name is valid */
193 KX_Camera* KX_SceneActuator::FindCamera(char *camName)
195 KX_SceneList* sl = m_KetsjiEngine->CurrentScenes();
196 STR_String name = STR_String(camName);
197 KX_SceneList::iterator it = sl->begin();
198 KX_Camera* cam = NULL;
200 while ((it != sl->end()) && (!cam))
202 cam = (*it)->FindCamera(name);
211 KX_Scene* KX_SceneActuator::FindScene(char * sceneName)
213 return m_KetsjiEngine->FindScene(sceneName);
219 /* ------------------------------------------------------------------------- */
220 /* Python functions */
221 /* ------------------------------------------------------------------------- */
223 /* Integration hooks ------------------------------------------------------- */
224 PyTypeObject KX_SceneActuator::Type = {
225 PyVarObject_HEAD_INIT(NULL, 0)
227 sizeof(PyObjectPlus_Proxy),
236 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
241 &SCA_IActuator::Type,
246 PyMethodDef KX_SceneActuator::Methods[] =
248 {NULL,NULL} //Sentinel
251 PyAttributeDef KX_SceneActuator::Attributes[] = {
252 KX_PYATTRIBUTE_STRING_RW("scene",0,32,true,KX_SceneActuator,m_nextSceneName),
253 KX_PYATTRIBUTE_RW_FUNCTION("camera",KX_SceneActuator,pyattr_get_camera,pyattr_set_camera),
254 KX_PYATTRIBUTE_BOOL_RW("useRestart", KX_SceneActuator, m_restart),
255 KX_PYATTRIBUTE_INT_RW("mode", KX_SCENE_NODEF+1, KX_SCENE_MAX-1, true, KX_SceneActuator, m_mode),
259 PyObject* KX_SceneActuator::pyattr_get_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef)
261 KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self);
262 if (!actuator->m_camera)
265 return actuator->m_camera->GetProxy();
268 int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
270 KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self);
273 if (!ConvertPythonToCamera(value, &camOb, true, "actu.camera = value: KX_SceneActuator"))
274 return PY_SET_ATTR_FAIL;
276 if (actuator->m_camera)
277 actuator->m_camera->UnregisterActuator(actuator);
280 actuator->m_camera= NULL;
283 actuator->m_camera = camOb;
284 actuator->m_camera->RegisterActuator(actuator);
287 return PY_SET_ATTR_SUCCESS;
290 #endif // WITH_PYTHON