gmxService.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. #include "gmxService.h"
  2. #include "meshContainer.h"
  3. #include "meshInstance.h"
  4. #include "..\..\common_h\corecmds.h"
  5. //INTERFACE_FUNCTION
  6. CREATE_SERVICE(GMXService, 60)
  7. #define GEOM_FOLDER "Resource\\Models\\"
  8. #define DEFAULT_ALPHA_REF 0.5f
  9. GMXService * GMXService::pGS = NULL;
  10. MeshInstance * GMXService::pHead = NULL;
  11. IPhysics * GMXService::pPhysic = NULL;
  12. #ifndef STOP_DEBUG
  13. IConsole* GMXService::pConsole = NULL;
  14. dword GMXService::bBlendShapeDebug = FALSE;
  15. dword GMXService::bGeometryDebug = FALSE;
  16. const char* hm_desc[] = { "None", "Show batches", "Show overdraw", "Show Diffuse", "Show Normal Map", "Show Parralax", "Show Shinines", "Show Gloss", "Show Occlusion", "Show normals", "Show binormal", "Show tangent", "Light Complex"};
  17. #endif
  18. GMXService::GMXService() : meshesFiles(_FL_)
  19. {
  20. mode = HM_OFF;
  21. #ifndef STOP_DEBUG
  22. pEmptyNormalMapTexture = NULL;
  23. show_mode = GMXSM_ALL;
  24. debugShaders = (IGMXService::RenderModeShaderId*)malloc(GMXService::HM_MAX * sizeof(IGMXService::RenderModeShaderId));
  25. #endif
  26. texturesPath[0] = 0;
  27. rmode_enabled = false;
  28. gmxAlphaRef = NULL;
  29. UserColorFromSceneDenied = false;
  30. pShadowService = NULL;
  31. pNoShadowTexture = NULL;
  32. bGlobalFrustumCull = true;
  33. #ifndef _XBOX
  34. skinBones = NULL;
  35. #else
  36. dwCurrentPoolIndex = 0;
  37. for (dword q = 0; q < VERTEXSTREAMS_WITH_CONSTANTS_POOL; q++)
  38. {
  39. bonesArrayPool[q] = NULL;
  40. }
  41. #endif
  42. GMX_ShadowColor = NULL;
  43. GMX_ShadowQuad = NULL;
  44. pUserColor = NULL;
  45. dwCacheFrameNum = 1;
  46. SetRenderMode(NULL);
  47. }
  48. bool GMXService::Init()
  49. {
  50. GMXService::pGS = this;
  51. pFS = (IFileService*)api->GetService("FileService");
  52. Assert(pFS);
  53. pRS = (IRender*)api->GetService("DX9Render");
  54. Assert(pRS);
  55. #ifndef STOP_DEBUG
  56. GetRenderModeShaderId("gmx_ShowDiffuse", debugShaders[GMXService::HM_SHOW_DIFFUSE]);
  57. GetRenderModeShaderId("gmx_ShowBatches", debugShaders[GMXService::HM_SHOW_BATCHES]);
  58. GetRenderModeShaderId("gmx_ShowOverDraw", debugShaders[GMXService::HM_SHOW_OVERDRAW]);
  59. GetRenderModeShaderId("gmx_ShowNormalMap", debugShaders[GMXService::HM_SHOW_NORMAL_MAP]);
  60. GetRenderModeShaderId("gmx_ShowParralax", debugShaders[GMXService::HM_SHOW_PARALLAX]);
  61. GetRenderModeShaderId("gmx_ShowShinines", debugShaders[GMXService::HM_SHOW_SHININES]);
  62. GetRenderModeShaderId("gmx_ShowGloss", debugShaders[GMXService::HM_SHOW_GLOSS]);
  63. GetRenderModeShaderId("gmx_ShowOcclusion", debugShaders[GMXService::HM_SHOW_OCCLUSION]);
  64. GetRenderModeShaderId("gmx_ShowNormals", debugShaders[GMXService::HM_SHOW_NORMALS]);
  65. GetRenderModeShaderId("gmx_ShowBiNormals", debugShaders[GMXService::HM_SHOW_BINORMALS]);
  66. GetRenderModeShaderId("gmx_ShowTangents", debugShaders[GMXService::HM_SHOW_TANGENTS]);
  67. GetRenderModeShaderId("gmx_ShowLightComplex", debugShaders[GMXService::HM_SHOWLIGHTCOMPLEX]);
  68. #endif
  69. pUserColor = NULL;
  70. pUserColor = pRS->GetTechniqueGlobalVariable("GMX_ObjectsUserColor", _FL_);
  71. if (pUserColor)
  72. {
  73. pUserColor->SetVector4(Color(0.0f, 0.0f, 0.0f).v4);
  74. }
  75. #ifndef _XBOX
  76. skinBones = pRS->GetTechniqueGlobalVariable("GMX_skinBones", _FL_);
  77. #else
  78. const dword maxBonesPerPass = 75;
  79. //const dword maxBonesPerPass = 255;
  80. dwCurrentPoolIndex = 0;
  81. for (dword q = 0; q < VERTEXSTREAMS_WITH_CONSTANTS_POOL; q++)
  82. {
  83. bonesArrayPool[q] = pRS->CreateVertexBuffer(sizeof(Vector4) * 3 * maxBonesPerPass, sizeof(Vector4) * 3, _FL_);
  84. byte* memToClear = (byte*)bonesArrayPool[q]->Lock();
  85. memset (memToClear, 0, sizeof(Vector4) * 3 * maxBonesPerPass);
  86. bonesArrayPool[q]->Unlock();
  87. }
  88. #endif
  89. GMX_ShadowQuad = pRS->GetTechniqueGlobalVariable("GMX_ShadowQuad", _FL_);
  90. GMX_ShadowColor = pRS->GetTechniqueGlobalVariable("GMX_ShadowColor", _FL_);
  91. gmxAlphaRef = pRS->GetTechniqueGlobalVariable("gmxAlphaRef", _FL_);
  92. if (gmxAlphaRef)
  93. {
  94. gmxAlphaRef->SetFloat(DEFAULT_ALPHA_REF);
  95. }
  96. api->SetEndFrameLevel(this, Core_DefaultExecuteLevel);
  97. RENDERLOCKED_RECT lr;
  98. pNoShadowTexture = pRS->CreateTexture(4, 4, 1, 0, FMT_DXT1, _FL_);
  99. Assert(pNoShadowTexture != NULL);
  100. if (pNoShadowTexture->LockRect(0, &lr, null, 0))
  101. {
  102. ((dword*)lr.pBits)[0] = 0xFFFFFFFF;
  103. ((dword*)lr.pBits)[1] = 0x00;
  104. pNoShadowTexture->UnlockRect(0);
  105. }
  106. #ifndef STOP_DEBUG
  107. pEmptyNormalMapTexture = pRS->CreateTexture(4, 4, 1, 0, FMT_DXT1, _FL_);
  108. Assert(pEmptyNormalMapTexture != NULL);
  109. if (pEmptyNormalMapTexture->LockRect(0, &lr, null, 0))
  110. {
  111. ((dword*)lr.pBits)[0] = 0x841F841F;
  112. ((dword*)lr.pBits)[1] = 0x00;
  113. pEmptyNormalMapTexture->UnlockRect(0);
  114. }
  115. #endif
  116. return true;
  117. };
  118. GMXService::~GMXService()
  119. {
  120. dumpMeshLeaksAndCleanup();
  121. #ifndef STOP_DEBUG
  122. free(debugShaders);
  123. #endif
  124. }
  125. void GMXService::SetHackMode (IGMXService::HackMode _mode)
  126. {
  127. mode = _mode;
  128. }
  129. IGMXService::HackMode GMXService::GetHackMode ()
  130. {
  131. return mode;
  132. }
  133. void GMXService::SetTexturePath(const char* szPath)
  134. {
  135. crt_strcpy(texturesPath, (MAX_PATH-1), szPath);
  136. }
  137. const char* GMXService::GetTexturePath()
  138. {
  139. return texturesPath;
  140. }
  141. IRender* GMXService::Render()
  142. {
  143. return pRS;
  144. }
  145. void GMXService::SetRenderMode (IGMXService::RenderModeShaderId * new_shaders, IGMXService::RenderModeShaderId * new_shaders_without_alpha)
  146. {
  147. if (new_shaders == NULL)
  148. {
  149. rmode_enabled = false;
  150. return;
  151. }
  152. rmode_enabled = true;
  153. rmode = *new_shaders;
  154. if (new_shaders_without_alpha != NULL)
  155. {
  156. rmode_noalpha = *new_shaders_without_alpha;
  157. } else
  158. {
  159. rmode_noalpha = *new_shaders;
  160. }
  161. }
  162. IGMXService::RenderModeShaderId * GMXService::GetRenderMode ()
  163. {
  164. return GetRenderMode_Fast();
  165. }
  166. IGMXService::RenderModeShaderId * GMXService::GetRenderModeNoAlpha ()
  167. {
  168. return GetRenderModeNoAlpha_Fast();
  169. }
  170. const Color& GMXService::GetUserColor ()
  171. {
  172. return serviceUserColor;
  173. }
  174. void GMXService::SetUserColor (const Color& clr)
  175. {
  176. serviceUserColor = clr;
  177. if (!pUserColor) return;
  178. pUserColor->SetVector4(clr.v4);
  179. float alphaRef = DEFAULT_ALPHA_REF * clr.v4.w;
  180. Clampf(alphaRef);
  181. gmxAlphaRef->SetFloat(alphaRef);
  182. }
  183. void GMXService::SetCustomAlphaRef(float alphaRef)
  184. {
  185. Clampf(alphaRef);
  186. gmxAlphaRef->SetFloat(alphaRef);
  187. }
  188. void GMXService::SuppressSceneSetUserColor (bool bDenied)
  189. {
  190. UserColorFromSceneDenied = bDenied;
  191. }
  192. bool GMXService::IsSuppressSceneSetUserColor ()
  193. {
  194. return UserColorFromSceneDenied;
  195. }
  196. bool GMXService::GetGlobalFrustumCullState ()
  197. {
  198. return GetGlobalFrustumCullStateFast();
  199. }
  200. void GMXService::SetGlobalFrustumCullState (bool bEnable)
  201. {
  202. bGlobalFrustumCull = bEnable;
  203. }
  204. void GMXService::GetRenderModeShaderId (const char * szShaderName, IGMXService::RenderModeShaderId & shaders_id)
  205. {
  206. static char temp[8192];
  207. pRS->GetShaderLightingId(szShaderName, shaders_id.bones[0]);
  208. crt_snprintf(temp, 8000, "%s_anim_1", szShaderName);
  209. pRS->GetShaderLightingId(temp, shaders_id.bones[1]);
  210. crt_snprintf(temp, 8000, "%s_anim_2", szShaderName);
  211. pRS->GetShaderLightingId(temp, shaders_id.bones[2]);
  212. crt_snprintf(temp, 8000, "%s_anim_3", szShaderName);
  213. pRS->GetShaderLightingId(temp, shaders_id.bones[3]);
  214. }
  215. #ifdef _XBOX
  216. IVBuffer* GMXService::GetSkinBones_Stream()
  217. {
  218. IVBuffer* ptr = bonesArrayPool[dwCurrentPoolIndex];
  219. dwCurrentPoolIndex++;
  220. if (dwCurrentPoolIndex >= VERTEXSTREAMS_WITH_CONSTANTS_POOL)
  221. {
  222. dwCurrentPoolIndex = 0;
  223. }
  224. return ptr;
  225. }
  226. #else
  227. IVariable* GMXService::GetSkinBones_Variable()
  228. {
  229. return skinBones;
  230. }
  231. #endif
  232. void GMXService::reportMeshContainerRelease(MeshContainer * meshFile)
  233. {
  234. htable<MeshContainer *>::iterator iter(meshesFiles);
  235. for (iter.Begin() ; iter.IsDone() == false ; iter.Next())
  236. {
  237. MeshContainer * & item = iter.Get();
  238. if (item == meshFile)
  239. {
  240. iter.DeleteCurrentItem();
  241. return;
  242. }
  243. }
  244. }
  245. IGMXScene* GMXService::CreateScene (const char* szFileName, IAnimationScene * animationScene, IParticleManager* pManager, ISoundScene * pSound, const char* pSourceFile, int Line)
  246. {
  247. if (szFileName == NULL || szFileName[0] == 0)
  248. {
  249. return NULL;
  250. }
  251. //из за quick модулей можем загрузиться раньше этих служб....
  252. //--------------------------------------------
  253. if (pPhysic == NULL)
  254. {
  255. pPhysic = (IPhysics*)api->GetService("PhysicsService");
  256. }
  257. if (pShadowService == NULL)
  258. {
  259. pShadowService = (IShadowsService*)api->GetService("ShadowsService");
  260. }
  261. //физика нужна по любому для MeshContainer::CreateCollision()
  262. Assert(pPhysic);
  263. //Без теней проживем
  264. //Assert(pShadowService);
  265. //--------------------------------------------
  266. strBuffer1 = szFileName;
  267. strBuffer2.GetFileTitle(strBuffer1);
  268. MeshContainer * const *meshContainer = meshesFiles.FindElement(strBuffer2.c_str());
  269. if (meshContainer)
  270. {
  271. (*meshContainer)->AddRef();
  272. MeshInstance * mesh = allocMeshInstance(*meshContainer, strBuffer2.c_str(), pSourceFile, Line);
  273. mesh->SetManagers(animationScene, pManager, pSound);
  274. return mesh;
  275. }
  276. //надо загрузить...
  277. string & longFileName = strBuffer1;
  278. longFileName = GEOM_FOLDER;
  279. longFileName += szFileName;
  280. longFileName.AddExtention(".gmx");
  281. IDataFile * pFile = pFS->OpenDataFile(longFileName.c_str(), file_open_default, _FL_);
  282. if (!pFile)
  283. {
  284. api->Error("GMX: '%s' File not found !!! (%s, %d)", longFileName.GetBuffer(), pSourceFile, Line);
  285. return NULL;
  286. }
  287. //---- создаем из файла ----
  288. MeshContainer * meshFile = NEW MeshContainer(pRS);
  289. bool bLoadResult = meshFile->Load(pFile, pFS, longFileName.c_str());
  290. RELEASE(pFile);
  291. if (bLoadResult == false)
  292. {
  293. return NULL;
  294. }
  295. MeshInstance * mesh = allocMeshInstance(meshFile, strBuffer2.c_str(), pSourceFile, Line);
  296. mesh->SetManagers(animationScene, pManager, pSound);
  297. meshesFiles.Add(strBuffer2, meshFile);
  298. return mesh;
  299. }
  300. void GMXService::dumpMeshLeaksAndCleanup()
  301. {
  302. api->Trace("GMXService - dtor");
  303. if (pNoShadowTexture)
  304. {
  305. pNoShadowTexture->Release();
  306. pNoShadowTexture = NULL;
  307. }
  308. #ifndef STOP_DEBUG
  309. if (pEmptyNormalMapTexture)
  310. {
  311. pEmptyNormalMapTexture->Release();
  312. pEmptyNormalMapTexture = NULL;
  313. }
  314. #endif
  315. MeshInstance * m = GMXService::pHead;
  316. if (m)
  317. {
  318. api->Trace("[mesh leaks]\n=========================================================================\n");
  319. }
  320. while(m)
  321. {
  322. api->Trace("Mesh leaked, created from '%s', %d", m->getSourceFile(), m->getSourceLine());
  323. MeshInstance * meshToDelete = m;
  324. m = m->next();
  325. meshToDelete->ForceRelease();
  326. }
  327. }
  328. void GMXService::EndFrame(float dltTime)
  329. {
  330. dwCacheFrameNum++;
  331. #ifndef STOP_DEBUG
  332. if (pConsole == NULL)
  333. {
  334. pConsole = (IConsole*)api->GetService("Console");
  335. if (pConsole != NULL)
  336. {
  337. pConsole->RegisterCommand("bs", "Переключает режим отладки блендшейпов геометрии", this, (CONSOLE_COMMAND)&GMXService::BlendShapesDebugSwitch);
  338. pConsole->RegisterCommand("gd", "Переключает режим отладки геометрии", this, (CONSOLE_COMMAND)&GMXService::GeometryDebugModeSwitch);
  339. }
  340. }
  341. if (api->DebugKeyState(VK_CONTROL, '2') || api->DebugKeyState(ICore::xb_right_thumb))
  342. {
  343. dword dMode = (dword)show_mode;
  344. dMode++;
  345. if (dMode == GMXSM_MAX)
  346. {
  347. dMode = GMXSM_ALL;
  348. }
  349. show_mode = (GMX_ShowMode)dMode;
  350. Sleep(200);
  351. }
  352. if (api->DebugKeyState(VK_SHIFT, '2'))
  353. {
  354. dword dMode = (dword)show_mode;
  355. if (dMode <= GMXSM_ALL)
  356. {
  357. dMode = GMXSM_MAX-1;
  358. } else
  359. {
  360. dMode--;
  361. }
  362. show_mode = (GMX_ShowMode)dMode;
  363. Sleep(200);
  364. }
  365. if (api->DebugKeyState(VK_CONTROL, '3') || api->DebugKeyState(ICore::xb_dpad_up))
  366. {
  367. dword dMode = (dword)mode;
  368. dMode++;
  369. if (dMode >= HM_MAX)
  370. {
  371. dMode = HM_OFF;
  372. }
  373. mode = (HackMode)dMode;
  374. Sleep(200);
  375. }
  376. if (api->DebugKeyState(VK_SHIFT, '3'))
  377. {
  378. dword dMode = (dword)mode;
  379. if (dMode <= HM_OFF)
  380. {
  381. dMode = HM_MAX-1;
  382. } else
  383. {
  384. dMode--;
  385. }
  386. mode = (HackMode)dMode;
  387. Sleep(200);
  388. }
  389. if (show_mode != GMXSM_ALL || mode != HM_OFF)
  390. {
  391. float fHeight = (float)pRS->GetScreenInfo2D().dwHeight - 64.0f;
  392. const char * szMode = "Normal";
  393. if (show_mode == GMXSM_NODIFFUSE)
  394. {
  395. szMode = "Diffuse : disabled, Normals : enabled";
  396. }
  397. if (show_mode == GMXSM_NONORMAL)
  398. {
  399. szMode = "Diffuse : enabled, Normals : disabled";
  400. }
  401. if (show_mode == GMXSM_NODIFFUSE_NONORMAL)
  402. {
  403. szMode = "Diffuse : disabled, Normals : disabled";
  404. }
  405. if (show_mode == GMXSM_MAX)
  406. {
  407. szMode = "WTF ???!!";
  408. }
  409. RS_SPRITE spr[4];
  410. spr[0].vPos = Vector(-1.0f, -0.8f, 0.2f); spr[1].vPos = Vector(1.0f, -0.8f, 0.2f);
  411. spr[2].vPos = Vector(1.0f, -1.0f, 0.2f); spr[3].vPos = Vector(-1.0f, -1.0f, 0.2f);
  412. pRS->DrawSprites(NULL, spr, 1, "dbgInfoSprite");
  413. pRS->Print(0, fHeight, 0xFFFFFFFF, "Texture mode: '%s'", szMode);
  414. pRS->Print(0, fHeight + pRS->GetSystemFont()->GetHeight() + 2.0f, 0xFFFFFFFF, "Shader mode: '%s'", hm_desc[mode]);
  415. }
  416. #endif
  417. }
  418. MeshInstance * GMXService::allocMeshInstance(MeshContainer * _container, const char * debugMeshName, const char* pSourceFile, int Line)
  419. {
  420. dword dwBonesCount = _container->getBonesCount();
  421. dword dwDynamicTransformsCount = _container->getDynamicTransformsCount();
  422. dword dwLocatorsWithParticlesCount = _container->getLocatorsWithParticlesCount();
  423. dword dwBlendShapeBonesCount = _container->getBlendShapesBonesCount();
  424. dword dwBlendShapeTargetsCount = _container->getBlendShapesMorphTargetsCount();
  425. //-------------------
  426. dword _dwBonesGPUDataSize = sizeof(boneGpuData) * dwBonesCount;
  427. dword dwBonesGPUDataSize_Aligned = ((_dwBonesGPUDataSize + 15) & ~15);
  428. dword _dwGeomToAnim_TranslateTableSize = (dwBonesCount * sizeof(long));
  429. dword dwGeomToAnim_TranslateTableSize_Aligned = ((_dwGeomToAnim_TranslateTableSize + 15) & ~15);
  430. dword _dwAnimToGeom_TranslateTableSize = (MAX_ANIMATION_BONES * sizeof(long));
  431. dword dwAnimToGeom_TranslateTableSize_Aligned = ((_dwAnimToGeom_TranslateTableSize + 15) & ~15);
  432. //-------------------
  433. dword _dwParticlesPtrCacheSize = (dwLocatorsWithParticlesCount * sizeof(MeshParticleOnLocator));
  434. dword dwParticlesPtrCacheSize_Aligned = ((_dwParticlesPtrCacheSize + 15) & ~15);
  435. //-------------------
  436. dword _dwMorphTargetsWeightTable = (dwBlendShapeTargetsCount * sizeof(float));
  437. dword dwMorphTargetsWeightTable_Aligned = ((_dwMorphTargetsWeightTable + 15) & ~15);
  438. dword _dwAnimToGeomBlendShapes_TranslateTableSize = (MAX_ANIMATION_BONES * sizeof(long));
  439. dword dwAnimToGeomBlendShapes_TranslateTableSize_Aligned = ((_dwAnimToGeomBlendShapes_TranslateTableSize + 15) & ~15);
  440. //-------------------
  441. dword _dwTransofrmIDSize = (dwDynamicTransformsCount * sizeof(long));
  442. dword dwTransofrmIDSize_Aligned = ((_dwTransofrmIDSize + 15) & ~15);
  443. dword dwTransofrmMtxCacheSize = (dwDynamicTransformsCount * sizeof(Matrix));
  444. //-------------------
  445. dword dwAdditionalDataSize = dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned + dwParticlesPtrCacheSize_Aligned + dwTransofrmIDSize_Aligned + dwParticlesPtrCacheSize_Aligned + dwMorphTargetsWeightTable_Aligned + dwAnimToGeomBlendShapes_TranslateTableSize_Aligned + dwTransofrmMtxCacheSize;
  446. dword dwNeedBytes = ((sizeof(MeshInstance) + 16) + dwAdditionalDataSize);
  447. byte * myCustomMemory = (byte *)meshAlloc(dwNeedBytes, _FL_);
  448. byte * myCustomMemoryEnd = ((myCustomMemory + dwNeedBytes) - 1);
  449. MeshInstance* mesh = (MeshInstance*)myCustomMemory;
  450. byte* dataStart = AlignPtr((myCustomMemory + sizeof(MeshInstance)));
  451. MESH_ALIGN_16_CHECK(dataStart);
  452. boneGpuData * pBonesGPUdata = NULL;
  453. long * pGeomToAnim_TranslateTable = NULL;
  454. long * pAnimToGeom_TranslateTable = NULL;
  455. if (dwBonesCount > 0)
  456. {
  457. pBonesGPUdata = (boneGpuData*)dataStart;
  458. MESH_ALIGN_16_CHECK(pBonesGPUdata);
  459. pGeomToAnim_TranslateTable = (long*)(dataStart + dwBonesGPUDataSize_Aligned);
  460. MESH_ALIGN_16_CHECK(pGeomToAnim_TranslateTable);
  461. pAnimToGeom_TranslateTable = (long*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned);
  462. MESH_ALIGN_16_CHECK(pAnimToGeom_TranslateTable);
  463. }
  464. MeshParticleOnLocator* pParticlesPtrCache = NULL;
  465. if (dwLocatorsWithParticlesCount > 0)
  466. {
  467. pParticlesPtrCache = (MeshParticleOnLocator*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned);
  468. MESH_ALIGN_16_CHECK(pParticlesPtrCache);
  469. }
  470. float * pMorphTargetsWeights = NULL;
  471. long * pAnimToGeomBlendShapes_TranslateTable = NULL;
  472. if (dwBlendShapeBonesCount > 0)
  473. {
  474. pMorphTargetsWeights = (float*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned + dwParticlesPtrCacheSize_Aligned);
  475. MESH_ALIGN_16_CHECK(pMorphTargetsWeights);
  476. pAnimToGeomBlendShapes_TranslateTable = (long*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned + dwParticlesPtrCacheSize_Aligned + dwMorphTargetsWeightTable_Aligned);
  477. MESH_ALIGN_16_CHECK(pAnimToGeomBlendShapes_TranslateTable);
  478. }
  479. long * pDynamicTransofrmsBonesID = NULL;
  480. Matrix * pDynamicTransofrmsBonesMatrixCache = NULL;
  481. if (dwDynamicTransformsCount > 0)
  482. {
  483. pDynamicTransofrmsBonesID = (long*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned + dwParticlesPtrCacheSize_Aligned + dwMorphTargetsWeightTable_Aligned + dwAnimToGeomBlendShapes_TranslateTableSize_Aligned);
  484. MESH_ALIGN_16_CHECK(pDynamicTransofrmsBonesID);
  485. pDynamicTransofrmsBonesMatrixCache = (Matrix*)(dataStart + dwBonesGPUDataSize_Aligned + dwGeomToAnim_TranslateTableSize_Aligned + dwAnimToGeom_TranslateTableSize_Aligned + dwParticlesPtrCacheSize_Aligned + dwTransofrmIDSize_Aligned + dwMorphTargetsWeightTable_Aligned + dwAnimToGeomBlendShapes_TranslateTableSize_Aligned);
  486. MESH_ALIGN_16_CHECK(pDynamicTransofrmsBonesMatrixCache);
  487. byte * checkPtr = (byte*)&pDynamicTransofrmsBonesMatrixCache[dwDynamicTransformsCount - 1];
  488. Assert((checkPtr + sizeof(Matrix)-1) < (myCustomMemory + dwNeedBytes));
  489. }
  490. //инплейс коструктор вызываем...
  491. new('a', mesh) MeshInstance(pRS, _container, debugMeshName, pSourceFile, Line, pBonesGPUdata, pGeomToAnim_TranslateTable, pAnimToGeom_TranslateTable, pDynamicTransofrmsBonesID, pDynamicTransofrmsBonesMatrixCache, pParticlesPtrCache, pMorphTargetsWeights, pAnimToGeomBlendShapes_TranslateTable);
  492. //инициализируем данные...
  493. float fDefaultAlpha = 1.0f;
  494. float fDefaultScale = 1.0f;
  495. for (dword i = 0; i < dwBonesCount; i++)
  496. {
  497. pAnimToGeom_TranslateTable[i] = -1;
  498. pGeomToAnim_TranslateTable[i] = -1;
  499. pBonesGPUdata[i].data[2] = Vector4(fDefaultAlpha, fDefaultScale, 0.0f, 0.0f);
  500. }
  501. return mesh;
  502. /*
  503. MeshInstance * mesh = NEW MeshInstance(pRS, _container, pSourceFile, Line);
  504. return mesh;
  505. */
  506. }
  507. void GMXService::freeMeshInstance(MeshInstance * meshInst)
  508. {
  509. meshInst->~MeshInstance();
  510. meshFree(meshInst, _FL_);
  511. //delete meshInst;
  512. }
  513. #ifndef STOP_DEBUG
  514. void _cdecl GMXService::GeometryDebugModeSwitch(const ConsoleStack& stack)
  515. {
  516. bGeometryDebug = !bGeometryDebug;
  517. if (bGeometryDebug)
  518. {
  519. pConsole->Trace(COL_ALL, "GeometryDebug - enabled");
  520. } else
  521. {
  522. pConsole->Trace(COL_ALL, "GeometryDebug - disabled");
  523. }
  524. }
  525. void _cdecl GMXService::BlendShapesDebugSwitch(const ConsoleStack& stack)
  526. {
  527. bBlendShapeDebug = !bBlendShapeDebug;
  528. if (bBlendShapeDebug)
  529. {
  530. pConsole->Trace(COL_ALL, "BlendShapesDebug - enabled");
  531. } else
  532. {
  533. pConsole->Trace(COL_ALL, "BlendShapesDebug - disabled");
  534. }
  535. }
  536. #endif