KX_BlenderSceneConverter.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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 KX_BlenderSceneConverter.h
  28. * \ingroup bgeconv
  29. */
  30. #ifndef __KX_BLENDERSCENECONVERTER_H__
  31. #define __KX_BLENDERSCENECONVERTER_H__
  32. #include "EXP_HashedPtr.h"
  33. #include "CTR_Map.h"
  34. #include <stdio.h>
  35. #include "KX_ISceneConverter.h"
  36. #include "KX_IpoConvert.h"
  37. #include <map>
  38. using namespace std;
  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. struct ThreadInfo;
  49. struct Material;
  50. typedef map<KX_Scene*, map<Material*, BL_Material*> > MaterialCache;
  51. typedef map<KX_Scene*, map<Material*, RAS_IPolyMaterial*> > PolyMaterialCache;
  52. class KX_BlenderSceneConverter : public KX_ISceneConverter
  53. {
  54. // Use vector of pairs to allow removal of entities between scene switch
  55. vector<pair<KX_Scene*,KX_WorldInfo*> > m_worldinfos;
  56. vector<pair<KX_Scene*,RAS_IPolyMaterial*> > m_polymaterials;
  57. vector<pair<KX_Scene*,RAS_MeshObject*> > m_meshobjects;
  58. vector<pair<KX_Scene*,BL_Material *> > m_materials;
  59. vector<class KX_LibLoadStatus*> m_mergequeue;
  60. ThreadInfo *m_threadinfo;
  61. // Cached material conversions
  62. MaterialCache m_mat_cache;
  63. PolyMaterialCache m_polymat_cache;
  64. // Saved KX_LibLoadStatus objects
  65. map<char *, class KX_LibLoadStatus*> m_status_map;
  66. // Should also have a list of collision shapes.
  67. // For the time being this is held in KX_Scene::m_shapes
  68. CTR_Map<CHashedPtr,KX_GameObject*> m_map_blender_to_gameobject; /* cleared after conversion */
  69. CTR_Map<CHashedPtr,RAS_MeshObject*> m_map_mesh_to_gamemesh; /* cleared after conversion */
  70. CTR_Map<CHashedPtr,SCA_IActuator*> m_map_blender_to_gameactuator; /* cleared after conversion */
  71. CTR_Map<CHashedPtr,SCA_IController*>m_map_blender_to_gamecontroller; /* cleared after conversion */
  72. CTR_Map<CHashedPtr,BL_InterpolatorList*> m_map_blender_to_gameAdtList;
  73. Main* m_maggie;
  74. vector<struct Main*> m_DynamicMaggie;
  75. STR_String m_newfilename;
  76. class KX_KetsjiEngine* m_ketsjiEngine;
  77. class KX_Scene* m_currentScene; // Scene being converted
  78. bool m_alwaysUseExpandFraming;
  79. bool m_usemat;
  80. bool m_useglslmat;
  81. bool m_use_mat_cache;
  82. public:
  83. KX_BlenderSceneConverter(
  84. Main* maggie,
  85. class KX_KetsjiEngine* engine
  86. );
  87. virtual ~KX_BlenderSceneConverter();
  88. /* Scenename: name of the scene to be converted.
  89. * destinationscene: pass an empty scene, everything goes into this
  90. * dictobj: python dictionary (for pythoncontrollers)
  91. */
  92. virtual void ConvertScene(
  93. class KX_Scene* destinationscene,
  94. class RAS_IRasterizer* rendertools,
  95. class RAS_ICanvas* canvas,
  96. bool libloading=false
  97. );
  98. virtual void RemoveScene(class KX_Scene *scene);
  99. void SetNewFileName(const STR_String& filename);
  100. bool TryAndLoadNewFile();
  101. void SetAlwaysUseExpandFraming(bool to_what);
  102. void RegisterGameObject(KX_GameObject *gameobject, struct Object *for_blenderobject);
  103. void UnregisterGameObject(KX_GameObject *gameobject);
  104. KX_GameObject *FindGameObject(struct Object *for_blenderobject);
  105. void RegisterGameMesh(RAS_MeshObject *gamemesh, struct Mesh *for_blendermesh);
  106. RAS_MeshObject *FindGameMesh(struct Mesh *for_blendermesh/*, unsigned int onlayer*/);
  107. void RegisterPolyMaterial(RAS_IPolyMaterial *polymat);
  108. void CachePolyMaterial(KX_Scene *scene, Material *mat, RAS_IPolyMaterial *polymat);
  109. RAS_IPolyMaterial *FindCachedPolyMaterial(KX_Scene *scene, Material *mat);
  110. void RegisterBlenderMaterial(BL_Material *mat);
  111. void CacheBlenderMaterial(KX_Scene *scene, Material *mat, BL_Material *blmat);
  112. BL_Material *FindCachedBlenderMaterial(KX_Scene *scene, Material *mat);
  113. void RegisterInterpolatorList(BL_InterpolatorList *actList, struct bAction *for_act);
  114. BL_InterpolatorList *FindInterpolatorList(struct bAction *for_act);
  115. void RegisterGameActuator(SCA_IActuator *act, struct bActuator *for_actuator);
  116. SCA_IActuator *FindGameActuator(struct bActuator *for_actuator);
  117. void RegisterGameController(SCA_IController *cont, struct bController *for_controller);
  118. SCA_IController *FindGameController(struct bController *for_controller);
  119. void RegisterWorldInfo(KX_WorldInfo *worldinfo);
  120. virtual void ResetPhysicsObjectsAnimationIpo(bool clearIpo);
  121. ///this is for reseting the position,rotation and scale of the gameobjet that is not dynamic
  122. virtual void resetNoneDynamicObjectToIpo();
  123. ///this generates ipo curves for position, rotation, allowing to use game physics in animation
  124. virtual void WritePhysicsObjectToAnimationIpo(int frameNumber);
  125. virtual void TestHandlesPhysicsObjectToAnimationIpo();
  126. // use blender materials
  127. virtual void SetMaterials(bool val);
  128. virtual bool GetMaterials();
  129. // use blender glsl materials
  130. virtual void SetGLSLMaterials(bool val);
  131. virtual bool GetGLSLMaterials();
  132. // cache materials during conversion
  133. virtual void SetCacheMaterials(bool val);
  134. virtual bool GetCacheMaterials();
  135. struct Scene* GetBlenderSceneForName(const STR_String& name);
  136. // struct Main* GetMain() { return m_maggie; }
  137. struct Main* GetMainDynamicPath(const char *path);
  138. vector<struct Main*> &GetMainDynamic();
  139. class KX_LibLoadStatus *LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
  140. class KX_LibLoadStatus *LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
  141. class KX_LibLoadStatus *LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
  142. bool MergeScene(KX_Scene *to, KX_Scene *from);
  143. RAS_MeshObject *ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name);
  144. bool FreeBlendFile(struct Main *maggie);
  145. bool FreeBlendFile(const char *path);
  146. virtual void MergeAsyncLoads();
  147. virtual void FinalizeAsyncLoads();
  148. void AddScenesToMergeQueue(class KX_LibLoadStatus *status);
  149. void PrintStats() {
  150. printf("BGE STATS!\n");
  151. printf("\nAssets...\n");
  152. printf("\t m_worldinfos: %d\n", (int)m_worldinfos.size());
  153. printf("\t m_polymaterials: %d\n", (int)m_polymaterials.size());
  154. printf("\t m_meshobjects: %d\n", (int)m_meshobjects.size());
  155. printf("\t m_materials: %d\n", (int)m_materials.size());
  156. printf("\nMappings...\n");
  157. printf("\t m_map_blender_to_gameobject: %d\n", m_map_blender_to_gameobject.size());
  158. printf("\t m_map_mesh_to_gamemesh: %d\n", m_map_mesh_to_gamemesh.size());
  159. printf("\t m_map_blender_to_gameactuator: %d\n", m_map_blender_to_gameactuator.size());
  160. printf("\t m_map_blender_to_gamecontroller: %d\n", m_map_blender_to_gamecontroller.size());
  161. printf("\t m_map_blender_to_gameAdtList: %d\n", m_map_blender_to_gameAdtList.size());
  162. #ifdef WITH_CXX_GUARDEDALLOC
  163. MEM_printmemlist_pydict();
  164. #endif
  165. // /printf("\t m_ketsjiEngine->m_scenes: %d\n", m_ketsjiEngine->CurrentScenes()->size());
  166. }
  167. /* LibLoad Options */
  168. enum
  169. {
  170. LIB_LOAD_LOAD_ACTIONS = 1,
  171. LIB_LOAD_VERBOSE = 2,
  172. LIB_LOAD_LOAD_SCRIPTS = 4,
  173. LIB_LOAD_ASYNC = 8,
  174. };
  175. #ifdef WITH_PYTHON
  176. PyObject *GetPyNamespace();
  177. #endif
  178. #ifdef WITH_CXX_GUARDEDALLOC
  179. MEM_CXX_CLASS_ALLOC_FUNCS("GE:KX_BlenderSceneConverter")
  180. #endif
  181. };
  182. #endif /* __KX_BLENDERSCENECONVERTER_H__ */