Initial revision
[blender.git] / source / gameengine / GameLogic / SCA_LogicManager.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * Regulates the top-level logic behaviour for one scene.
32  */
33 #ifndef __KX_LOGICMANAGER
34 #define __KX_LOGICMANAGER
35
36 #ifdef WIN32
37 #pragma warning (disable:4786)
38 #endif 
39
40 #include <vector>
41 //#include "GEN_Map.h"
42 #include <set>
43 #include <map>
44 #include <list>
45
46 #include "GEN_Map.h"
47 #include "STR_HashedString.h"
48 #include "Value.h"
49
50 using namespace std;
51 typedef list<class SCA_IController*> controllerlist;
52
53 /** 
54  * This manager handles sensor, controllers and actuators.
55  * logic executes each frame the following way:
56  * find triggering sensors
57  * build list of controllers that are triggered by these triggering sensors
58  * process all triggered controllers
59  * during this phase actuators can be added to the active actuator list
60  * process all active actuators
61  * clear triggering sensors
62  * clear triggered controllers
63  * (actuators may be active during a longer timeframe)
64 */
65
66 #include "SCA_ILogicBrick.h"
67
68 // todo: make this into a template, but first I want to think about what exactly to put in
69 class   SmartActuatorPtr
70 {
71         SCA_IActuator*  m_actuator;
72 public:
73         SmartActuatorPtr(SCA_IActuator* actua,int dummy);
74         SmartActuatorPtr(const SmartActuatorPtr& other);
75         virtual ~SmartActuatorPtr();
76         bool operator <(const SmartActuatorPtr& other) const;
77         bool operator ==(const SmartActuatorPtr& other) const;
78         SCA_IActuator*  operator->() const;
79         SCA_IActuator* operator*() const;
80
81 };
82
83 class   SmartControllerPtr
84 {
85         SCA_IController*        m_controller;
86 public:
87         SmartControllerPtr(const SmartControllerPtr& copy);
88         SmartControllerPtr(SCA_IController* contr,int dummy);
89         virtual ~SmartControllerPtr();
90         bool    operator <(const SmartControllerPtr& other) const;
91         bool    operator ==(const SmartControllerPtr& other) const;
92         SCA_IController*        operator->() const;
93         SCA_IController*        operator*() const; 
94
95 };
96
97
98
99 class SCA_LogicManager
100 {
101         vector<class SCA_EventManager*>         m_eventmanagers;
102         
103         vector<class SCA_ISensor*>                      m_activatedsensors;
104         set<class SmartActuatorPtr>                     m_activeActuators;
105
106         map<SCA_ISensor*,controllerlist >       m_sensorcontrollermapje;
107
108         // need to find better way for this
109         // also known as FactoryManager...
110         GEN_Map<STR_HashedString,CValue*>       m_mapStringToGameObjects;
111         GEN_Map<STR_HashedString,void*>         m_mapStringToMeshes;
112         GEN_Map<STR_HashedString,void*>         m_mapStringToActions;
113
114         vector<SmartActuatorPtr>                        m_removedActuators;
115
116 public:
117         SCA_LogicManager();
118         virtual ~SCA_LogicManager();
119         //void  SetKeyboardManager(SCA_KeyboardManager* keyboardmgr) { m_keyboardmgr=keyboardmgr;}
120         void    RegisterEventManager(SCA_EventManager* eventmgr);
121         void    RegisterToSensor(SCA_IController* controller,
122                                                          class SCA_ISensor* sensor);
123         void    RegisterToActuator(SCA_IController* controller,
124                                                            class SCA_IActuator* actuator);
125         
126         void    BeginFrame(double curtime,double deltatime);
127         void    UpdateFrame(double curtime,double deltatime);
128         void    EndFrame();
129         void    AddActivatedSensor(SCA_ISensor* sensor);
130         void    AddActiveActuator(SCA_IActuator* sensor,class CValue* event);
131         SCA_EventManager*       FindEventManager(int eventmgrtype);
132         
133         void    RemoveGameObject(const STR_String& gameobjname);
134
135         /**
136         * remove Logic Bricks from the running logicmanager
137         */
138         void    RemoveSensor(SCA_ISensor* sensor);
139         void    RemoveController(SCA_IController* controller);
140         void    RemoveDestroyedActuator(SCA_IActuator* actuator);
141         
142
143         // for the scripting... needs a FactoryManager later (if we would have time... ;)
144         void    RegisterMeshName(const STR_String& meshname,void* mesh);
145         void    RegisterActionName(const STR_String& actname,void* action);
146
147         void*   GetActionByName (const STR_String& actname);
148         void*   GetMeshByName(const STR_String& meshname);
149
150         void    RegisterGameObjectName(const STR_String& gameobjname,CValue* gameobj);
151         class CValue*   GetGameObjectByName(const STR_String& gameobjname);
152 };
153
154 #endif //__KX_LOGICMANAGER