synched with trunk at revision 34793
[blender-staging.git] / source / gameengine / Converter / KX_BlenderSceneConverter.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL 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.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29 #ifndef __KX_BLENDERSCENECONVERTER_H
30 #define __KX_BLENDERSCENECONVERTER_H
31
32 #include "KX_HashedPtr.h"
33 #include "GEN_Map.h"
34 #include <stdio.h>
35
36 #include "KX_ISceneConverter.h"
37 #include "KX_IpoConvert.h"
38
39 class KX_WorldInfo;
40 class SCA_IActuator;
41 class SCA_IController;
42 class RAS_MeshObject;
43 class RAS_IPolyMaterial;
44 class BL_InterpolatorList;
45 class BL_Material;
46 struct Main;
47 struct Scene;
48
49 class KX_BlenderSceneConverter : public KX_ISceneConverter
50 {
51         // Use vector of pairs to allow removal of entities between scene switch
52         vector<pair<KX_Scene*,KX_WorldInfo*> >  m_worldinfos;
53         vector<pair<KX_Scene*,RAS_IPolyMaterial*> > m_polymaterials;
54         vector<pair<KX_Scene*,RAS_MeshObject*> > m_meshobjects;
55         vector<pair<KX_Scene*,BL_Material *> >  m_materials;
56         // Should also have a list of collision shapes. 
57         // For the time being this is held in KX_Scene::m_shapes
58
59         GEN_Map<CHashedPtr,KX_GameObject*>      m_map_blender_to_gameobject;            /* cleared after conversion */
60         GEN_Map<CHashedPtr,RAS_MeshObject*>     m_map_mesh_to_gamemesh;                         /* cleared after conversion */
61         GEN_Map<CHashedPtr,SCA_IActuator*>      m_map_blender_to_gameactuator;          /* cleared after conversion */
62         GEN_Map<CHashedPtr,SCA_IController*>m_map_blender_to_gamecontroller;    /* cleared after conversion */
63         
64         GEN_Map<CHashedPtr,BL_InterpolatorList*> m_map_blender_to_gameAdtList;
65         
66         Main*                                   m_maggie;
67         vector<struct Main*>    m_DynamicMaggie;
68
69         STR_String                              m_newfilename;
70         class KX_KetsjiEngine*  m_ketsjiEngine;
71         class KX_Scene*                 m_currentScene; // Scene being converted
72         bool                                    m_alwaysUseExpandFraming;
73         bool                                    m_usemat;
74         bool                                    m_useglslmat;
75
76 public:
77         KX_BlenderSceneConverter(
78                 Main* maggie,
79                 class KX_KetsjiEngine* engine
80         );
81
82         virtual ~KX_BlenderSceneConverter();
83
84         /* Scenename: name of the scene to be converted.
85          * destinationscene: pass an empty scene, everything goes into this
86          * dictobj: python dictionary (for pythoncontrollers)
87          */
88         virtual void    ConvertScene(
89                                                 class KX_Scene* destinationscene,
90                                                 class RAS_IRenderTools* rendertools,
91                                                 class RAS_ICanvas* canvas
92                                         );
93         virtual void RemoveScene(class KX_Scene *scene);
94
95         void SetNewFileName(const STR_String& filename);
96         bool TryAndLoadNewFile();
97
98         void SetAlwaysUseExpandFraming(bool to_what);
99         
100         void RegisterGameObject(KX_GameObject *gameobject, struct Object *for_blenderobject);
101         void UnregisterGameObject(KX_GameObject *gameobject);
102         KX_GameObject *FindGameObject(struct Object *for_blenderobject);
103
104         void RegisterGameMesh(RAS_MeshObject *gamemesh, struct Mesh *for_blendermesh);
105         RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh/*, unsigned int onlayer*/);
106
107         void RegisterPolyMaterial(RAS_IPolyMaterial *polymat);
108
109         void RegisterBlenderMaterial(BL_Material *mat);
110         
111         void RegisterInterpolatorList(BL_InterpolatorList *adtList, struct AnimData *for_adt);
112         BL_InterpolatorList *FindInterpolatorList(struct AnimData *for_adt);
113
114         void RegisterGameActuator(SCA_IActuator *act, struct bActuator *for_actuator);
115         SCA_IActuator *FindGameActuator(struct bActuator *for_actuator);
116
117         void RegisterGameController(SCA_IController *cont, struct bController *for_controller);
118         SCA_IController *FindGameController(struct bController *for_controller);
119
120         void RegisterWorldInfo(KX_WorldInfo *worldinfo);
121
122         virtual void    ResetPhysicsObjectsAnimationIpo(bool clearIpo);
123
124         ///this is for reseting the position,rotation and scale of the gameobjet that is not dynamic
125         virtual void    resetNoneDynamicObjectToIpo();
126         
127         ///this generates ipo curves for position, rotation, allowing to use game physics in animation
128         virtual void    WritePhysicsObjectToAnimationIpo(int frameNumber);
129         virtual void    TestHandlesPhysicsObjectToAnimationIpo();
130
131         // use blender materials
132         virtual void SetMaterials(bool val);
133         virtual bool GetMaterials();
134
135         // use blender glsl materials
136         virtual void SetGLSLMaterials(bool val);
137         virtual bool GetGLSLMaterials();
138
139         struct Scene* GetBlenderSceneForName(const STR_String& name);
140
141 //      struct Main* GetMain() { return m_maggie; };
142         struct Main*              GetMainDynamicPath(const char *path);
143         vector<struct Main*> &GetMainDynamic();
144         
145         bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
146         bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str);
147         bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
148         bool MergeScene(KX_Scene *to, KX_Scene *from);
149         RAS_MeshObject *ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name);
150         bool FreeBlendFile(struct Main *maggie);
151         bool FreeBlendFile(const char *path);
152  
153         void PrintStats() {
154                 printf("BGE STATS!\n");
155
156                 printf("\nAssets...\n");
157                 printf("\t m_worldinfos: %d\n", (int)m_worldinfos.size());
158                 printf("\t m_polymaterials: %d\n", (int)m_polymaterials.size());
159                 printf("\t m_meshobjects: %d\n", (int)m_meshobjects.size());
160                 printf("\t m_materials: %d\n", (int)m_materials.size());
161
162                 printf("\nMappings...\n");
163                 printf("\t m_map_blender_to_gameobject: %d\n", (int)m_map_blender_to_gameobject.size());
164                 printf("\t m_map_mesh_to_gamemesh: %d\n", (int)m_map_mesh_to_gamemesh.size());
165                 printf("\t m_map_blender_to_gameactuator: %d\n", (int)m_map_blender_to_gameactuator.size());
166                 printf("\t m_map_blender_to_gamecontroller: %d\n", (int)m_map_blender_to_gamecontroller.size());
167                 printf("\t m_map_blender_to_gameAdtList: %d\n", (int)m_map_blender_to_gameAdtList.size());
168
169 #ifdef WITH_CXX_GUARDEDALLOC
170                 MEM_printmemlist_pydict();
171 #endif
172 //              /printf("\t m_ketsjiEngine->m_scenes: %d\n", m_ketsjiEngine->CurrentScenes()->size());
173         }
174
175
176
177 #ifndef DISABLE_PYTHON
178         PyObject *GetPyNamespace();
179 #endif
180         
181 #ifdef WITH_CXX_GUARDEDALLOC
182 public:
183         void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSceneConverter"); }
184         void operator delete( void *mem ) { MEM_freeN(mem); }
185 #endif
186 };
187
188 #endif //__KX_BLENDERSCENECONVERTER_H
189