|
Blender
V2.59
|
00001 /* 00002 * Set scene/camera stuff 00003 * 00004 * $Id: KX_SceneActuator.cpp 36523 2011-05-06 20:18:42Z blendix $ 00005 * 00006 * ***** BEGIN GPL LICENSE BLOCK ***** 00007 * 00008 * This program is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU General Public License 00010 * as published by the Free Software Foundation; either version 2 00011 * of the License, or (at your option) any later version. 00012 * 00013 * This program is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 * GNU General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU General Public License 00019 * along with this program; if not, write to the Free Software Foundation, 00020 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00021 * 00022 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. 00023 * All rights reserved. 00024 * 00025 * The Original Code is: all of this file. 00026 * 00027 * Contributor(s): none yet. 00028 * 00029 * ***** END GPL LICENSE BLOCK ***** 00030 */ 00031 00037 #include "SCA_IActuator.h" 00038 #include "KX_SceneActuator.h" 00039 #include <iostream> 00040 #include "KX_Scene.h" 00041 #include "KX_Camera.h" 00042 #include "KX_KetsjiEngine.h" 00043 00044 /* ------------------------------------------------------------------------- */ 00045 /* Native functions */ 00046 /* ------------------------------------------------------------------------- */ 00047 00048 KX_SceneActuator::KX_SceneActuator(SCA_IObject *gameobj, 00049 int mode, 00050 KX_Scene *scene, 00051 KX_KetsjiEngine* ketsjiEngine, 00052 const STR_String& nextSceneName, 00053 KX_Camera* camera) 00054 : SCA_IActuator(gameobj, KX_ACT_SCENE) 00055 { 00056 m_mode = mode; 00057 m_scene = scene; 00058 m_KetsjiEngine=ketsjiEngine; 00059 m_camera = camera; 00060 m_nextSceneName = nextSceneName; 00061 if (m_camera) 00062 m_camera->RegisterActuator(this); 00063 } /* End of constructor */ 00064 00065 00066 00067 KX_SceneActuator::~KX_SceneActuator() 00068 { 00069 if (m_camera) 00070 m_camera->UnregisterActuator(this); 00071 } /* end of destructor */ 00072 00073 00074 00075 CValue* KX_SceneActuator::GetReplica() 00076 { 00077 KX_SceneActuator* replica = new KX_SceneActuator(*this); 00078 replica->ProcessReplica(); 00079 return replica; 00080 } 00081 00082 void KX_SceneActuator::ProcessReplica() 00083 { 00084 if (m_camera) 00085 m_camera->RegisterActuator(this); 00086 SCA_IActuator::ProcessReplica(); 00087 } 00088 00089 bool KX_SceneActuator::UnlinkObject(SCA_IObject* clientobj) 00090 { 00091 if (clientobj == (SCA_IObject*)m_camera) 00092 { 00093 // this object is being deleted, we cannot continue to track it. 00094 m_camera = NULL; 00095 return true; 00096 } 00097 return false; 00098 } 00099 00100 void KX_SceneActuator::Relink(CTR_Map<CTR_HashedPtr, void*> *obj_map) 00101 { 00102 void **h_obj = (*obj_map)[m_camera]; 00103 if (h_obj) { 00104 if (m_camera) 00105 m_camera->UnregisterActuator(this); 00106 m_camera = (KX_Camera*)(*h_obj); 00107 m_camera->RegisterActuator(this); 00108 } 00109 } 00110 00111 00112 bool KX_SceneActuator::Update() 00113 { 00114 // bool result = false; /*unused*/ 00115 bool bNegativeEvent = IsNegativeEvent(); 00116 RemoveAllEvents(); 00117 00118 if (bNegativeEvent) 00119 return false; // do nothing on negative events 00120 00121 switch (m_mode) 00122 { 00123 case KX_SCENE_RESTART: 00124 { 00125 m_KetsjiEngine->ReplaceScene(m_scene->GetName(),m_scene->GetName()); 00126 break; 00127 } 00128 case KX_SCENE_SET_CAMERA: 00129 if (m_camera) 00130 { 00131 m_scene->SetActiveCamera(m_camera); 00132 } 00133 else 00134 { 00135 // if no camera is set and the parent object is a camera, use it as the camera 00136 SCA_IObject* parent = GetParent(); 00137 if (parent->GetGameObjectType()==SCA_IObject::OBJ_CAMERA) 00138 { 00139 m_scene->SetActiveCamera((KX_Camera*)parent); 00140 } 00141 } 00142 break; 00143 default: 00144 break; 00145 } 00146 00147 if (!m_nextSceneName.Length()) 00148 return false; 00149 00150 switch (m_mode) 00151 { 00152 case KX_SCENE_SET_SCENE: 00153 { 00154 m_KetsjiEngine->ReplaceScene(m_scene->GetName(),m_nextSceneName); 00155 break; 00156 } 00157 case KX_SCENE_ADD_FRONT_SCENE: 00158 { 00159 bool overlay=true; 00160 m_KetsjiEngine->ConvertAndAddScene(m_nextSceneName,overlay); 00161 break; 00162 } 00163 case KX_SCENE_ADD_BACK_SCENE: 00164 { 00165 bool overlay=false; 00166 m_KetsjiEngine->ConvertAndAddScene(m_nextSceneName,overlay); 00167 break; 00168 } 00169 case KX_SCENE_REMOVE_SCENE: 00170 { 00171 m_KetsjiEngine->RemoveScene(m_nextSceneName); 00172 break; 00173 } 00174 case KX_SCENE_SUSPEND: 00175 { 00176 m_KetsjiEngine->SuspendScene(m_nextSceneName); 00177 break; 00178 } 00179 case KX_SCENE_RESUME: 00180 { 00181 m_KetsjiEngine->ResumeScene(m_nextSceneName); 00182 break; 00183 } 00184 default: 00185 ; /* do nothing? this is an internal error !!! */ 00186 } 00187 00188 return false; 00189 } 00190 00191 00192 00193 /* returns a camera if the name is valid */ 00194 KX_Camera* KX_SceneActuator::FindCamera(char *camName) 00195 { 00196 KX_SceneList* sl = m_KetsjiEngine->CurrentScenes(); 00197 STR_String name = STR_String(camName); 00198 KX_SceneList::iterator it = sl->begin(); 00199 KX_Camera* cam = NULL; 00200 00201 while ((it != sl->end()) && (!cam)) 00202 { 00203 cam = (*it)->FindCamera(name); 00204 it++; 00205 } 00206 00207 return cam; 00208 } 00209 00210 00211 00212 KX_Scene* KX_SceneActuator::FindScene(char * sceneName) 00213 { 00214 return m_KetsjiEngine->FindScene(sceneName); 00215 } 00216 00217 00218 #ifdef WITH_PYTHON 00219 00220 /* ------------------------------------------------------------------------- */ 00221 /* Python functions */ 00222 /* ------------------------------------------------------------------------- */ 00223 00224 /* Integration hooks ------------------------------------------------------- */ 00225 PyTypeObject KX_SceneActuator::Type = { 00226 PyVarObject_HEAD_INIT(NULL, 0) 00227 "KX_SceneActuator", 00228 sizeof(PyObjectPlus_Proxy), 00229 0, 00230 py_base_dealloc, 00231 0, 00232 0, 00233 0, 00234 0, 00235 py_base_repr, 00236 0,0,0,0,0,0,0,0,0, 00237 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, 00238 0,0,0,0,0,0,0, 00239 Methods, 00240 0, 00241 0, 00242 &SCA_IActuator::Type, 00243 0,0,0,0,0,0, 00244 py_base_new 00245 }; 00246 00247 PyMethodDef KX_SceneActuator::Methods[] = 00248 { 00249 {NULL,NULL} //Sentinel 00250 }; 00251 00252 PyAttributeDef KX_SceneActuator::Attributes[] = { 00253 KX_PYATTRIBUTE_STRING_RW("scene",0,32,true,KX_SceneActuator,m_nextSceneName), 00254 KX_PYATTRIBUTE_RW_FUNCTION("camera",KX_SceneActuator,pyattr_get_camera,pyattr_set_camera), 00255 KX_PYATTRIBUTE_BOOL_RW("useRestart", KX_SceneActuator, m_restart), 00256 KX_PYATTRIBUTE_INT_RW("mode", KX_SCENE_NODEF+1, KX_SCENE_MAX-1, true, KX_SceneActuator, m_mode), 00257 { NULL } //Sentinel 00258 }; 00259 00260 PyObject* KX_SceneActuator::pyattr_get_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) 00261 { 00262 KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self); 00263 if (!actuator->m_camera) 00264 Py_RETURN_NONE; 00265 00266 return actuator->m_camera->GetProxy(); 00267 } 00268 00269 int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) 00270 { 00271 KX_SceneActuator* actuator = static_cast<KX_SceneActuator*>(self); 00272 KX_Camera *camOb; 00273 00274 if (!ConvertPythonToCamera(value, &camOb, true, "actu.camera = value: KX_SceneActuator")) 00275 return PY_SET_ATTR_FAIL; 00276 00277 if (actuator->m_camera) 00278 actuator->m_camera->UnregisterActuator(actuator); 00279 00280 if(camOb==NULL) { 00281 actuator->m_camera= NULL; 00282 } 00283 else { 00284 actuator->m_camera = camOb; 00285 actuator->m_camera->RegisterActuator(actuator); 00286 } 00287 00288 return PY_SET_ATTR_SUCCESS; 00289 } 00290 00291 #endif // WITH_PYTHON 00292 00293 /* eof */