Blender  V2.59
KX_SceneActuator.cpp
Go to the documentation of this file.
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 */