d0bd49e71af3e81ae77c8f192e68a1cda9c5cde1
[blender.git] / source / gameengine / GameLogic / SCA_LogicManager.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 /** \file SCA_IController.h
28  *  \ingroup gamelogic
29  *  \brief Regulates the top-level logic behavior for one scene.
30  */
31 #ifndef __SCA_LOGICMANAGER_H__
32 #define __SCA_LOGICMANAGER_H__
33
34 #if defined(WIN32) && !defined(FREE_WINDOWS)
35 #pragma warning (disable:4786)
36 #endif 
37
38 #include <vector>
39 //#include "CTR_Map.h"
40 #include <set>
41 #include <map>
42 #include <list>
43
44 #include "CTR_Map.h"
45 #include "STR_HashedString.h"
46 #include "Value.h"
47 #include "SG_QList.h"
48
49 #include "KX_HashedPtr.h"
50
51 using namespace std;
52 typedef std::list<class SCA_IController*> controllerlist;
53 typedef std::map<class SCA_ISensor*,controllerlist > sensormap_t;
54
55 /** 
56  * This manager handles sensor, controllers and actuators.
57  * logic executes each frame the following way:
58  * find triggering sensors
59  * build list of controllers that are triggered by these triggering sensors
60  * process all triggered controllers
61  * during this phase actuators can be added to the active actuator list
62  * process all active actuators
63  * clear triggering sensors
64  * clear triggered controllers
65  * (actuators may be active during a longer timeframe)
66 */
67
68 #include "SCA_ILogicBrick.h"
69 #include "SCA_IActuator.h"
70 #include "SCA_EventManager.h"
71
72
73 class SCA_LogicManager
74 {
75         vector<class SCA_EventManager*>         m_eventmanagers;
76         
77         // SG_DList: Head of objects having activated actuators
78         //           element: SCA_IObject::m_activeActuators
79         SG_DList                                                        m_activeActuators;
80         // SG_DList: Head of objects having activated controllers
81         //           element: SCA_IObject::m_activeControllers
82         SG_DList                                                        m_triggeredControllerSet;
83
84         // need to find better way for this
85         // also known as FactoryManager...
86         CTR_Map<STR_HashedString,CValue*>       m_mapStringToGameObjects;
87         CTR_Map<STR_HashedString,void*>         m_mapStringToMeshes;
88         CTR_Map<STR_HashedString,void*>         m_mapStringToActions;
89
90         CTR_Map<STR_HashedString,void*>         m_map_gamemeshname_to_blendobj;
91         CTR_Map<CHashedPtr,void*>                       m_map_blendobj_to_gameobj;
92 public:
93         SCA_LogicManager();
94         virtual ~SCA_LogicManager();
95
96         //void  SetKeyboardManager(SCA_KeyboardManager* keyboardmgr) { m_keyboardmgr=keyboardmgr;}
97         void    RegisterEventManager(SCA_EventManager* eventmgr);
98         void    RegisterToSensor(SCA_IController* controller,
99                                                          class SCA_ISensor* sensor);
100         void    RegisterToActuator(SCA_IController* controller,
101                                                            class SCA_IActuator* actuator);
102         
103         void    BeginFrame(double curtime, double fixedtime);
104         void    UpdateFrame(double curtime, bool frame);
105         void    EndFrame();
106         void    AddActiveActuator(SCA_IActuator* actua,bool event)
107         {
108                 actua->SetActive(true);
109                 actua->Activate(m_activeActuators);
110                 actua->AddEvent(event);
111         }
112
113         void    AddTriggeredController(SCA_IController* controller, SCA_ISensor* sensor);
114         SCA_EventManager*       FindEventManager(int eventmgrtype);
115         vector<class SCA_EventManager*> GetEventManagers() { return m_eventmanagers; }
116         
117         void    RemoveGameObject(const STR_String& gameobjname);
118
119         /**
120         * remove Logic Bricks from the running logicmanager
121         */
122         void    RemoveSensor(SCA_ISensor* sensor);
123         void    RemoveController(SCA_IController* controller);
124         void    RemoveActuator(SCA_IActuator* actuator);
125         
126
127         // for the scripting... needs a FactoryManager later (if we would have time... ;)
128         void    RegisterMeshName(const STR_String& meshname,void* mesh);
129         void    UnregisterMeshName(const STR_String& meshname,void* mesh);
130         CTR_Map<STR_HashedString,void*>&        GetMeshMap() { return m_mapStringToMeshes; };
131         CTR_Map<STR_HashedString,void*>&        GetActionMap() { return m_mapStringToActions; };
132         
133         void    RegisterActionName(const STR_String& actname,void* action);
134
135         void*   GetActionByName (const STR_String& actname);
136         void*   GetMeshByName(const STR_String& meshname);
137
138         void    RegisterGameObjectName(const STR_String& gameobjname,CValue* gameobj);
139         class CValue*   GetGameObjectByName(const STR_String& gameobjname);
140
141         void    RegisterGameMeshName(const STR_String& gamemeshname, void* blendobj);
142         void*   FindBlendObjByGameMeshName(const STR_String& gamemeshname);
143
144         void    RegisterGameObj(void* blendobj, CValue* gameobj);
145         void    UnregisterGameObj(void* blendobj, CValue* gameobj);
146         CValue* FindGameObjByBlendObj(void* blendobj);
147         
148         
149 #ifdef WITH_CXX_GUARDEDALLOC
150 public:
151         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:SCA_LogicManager"); }
152         void operator delete( void *mem ) { MEM_freeN(mem); }
153 #endif
154 };
155
156 #endif //__SCA_LOGICMANAGER_H__
157