• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Violet Vreath is Shooter Game for Windows XP+(個人制作シューティングゲーム)


Commit MetaInfo

Revisão5f2d84ad7fc0dabdfc10b2337f936238b1dbf768 (tree)
Hora2019-12-17 00:51:33
Autorgecchi <gecchi@XPS8...>
Commitergecchi

Mensagem de Log

AniMeshちょっと最適化

Mudança Sumário

Diff

--- a/GgafDx/include/jp/ggaf/dx/model/AniMeshModel.h
+++ b/GgafDx/include/jp/ggaf/dx/model/AniMeshModel.h
@@ -59,19 +59,20 @@ public:
5959 /** アニメーションコントローラ、Actor生成時にはこれが clone されてActorに保持されることになる */
6060 ID3DXAnimationController* _pAniControllerBase;
6161
62-
62+ /** _pFrameRoot を巡ってフレームを直列化したもの、要素番号はフレームインデックスと呼称する */
63+ std::vector<FrameWorldMatrix*> _vecAllBoneFrame;
6364 /** _pFrameRoot を巡ってメッシュコンテナがある描画対象フレームを直列化したもの、要素番号はただの連番 */
6465 std::vector<FrameWorldMatrix*> _vecDrawBoneFrame;
6566
67+
6668 /** 総アニメーションセット数 */
6769 UINT _num_animation_set;
68- /** 総アニメーションセットの配列、要素番号はアニメーションセットインデックスと呼称する */
69- std::vector<ID3DXAnimationSet*> _vecAnimationSet;
70- /** AnimationSet から、AnimationのターゲットのBoneFrame の Nameの配列が取得できるマップ */
71- std::map<ID3DXAnimationSet*, std::vector<LPCSTR>> _mapAnimationSet_AnimationTargetBoneFrameNames; //
72- /** フレームから、そのフレームが対象となっているアニメーションセットの配列を得る */
73- std::map<FrameWorldMatrix*, std::vector<ID3DXAnimationSet*>> _mapBornFrame_AnimationSetList; //
74-
70+ /** AnimationSet から、AnimationSetインデックスが取得できるマップ */
71+ std::map<ID3DXAnimationSet*, UINT> _mapAnimationSet_AniSetindex;
72+ /** アニメーションセットインデックスから、AnimationのターゲットのBoneFrame の Nameの配列が取得できるマップ */
73+ std::map<UINT, std::vector<LPCSTR>> _mapAnimationSetIndex_AnimationTargetBoneFrameNames;
74+ /** [アニメーションセットインデックス][フレームインデックス] で アニメーションセットのアニメーション対象のフレームであるかどうかが返る */
75+ bool** _papaBool_AnimationSetIndex_BoneFrameIndex_is_act;
7576
7677 int _anim_ticks_per_second;
7778 /** 60フレーム(1秒)で1ループする場合の1フレーム辺りの時間 */
--- a/GgafDx/include/jp/ggaf/dx/util/WorldMatStack.h
+++ b/GgafDx/include/jp/ggaf/dx/util/WorldMatStack.h
@@ -25,16 +25,15 @@ public:
2525
2626 /** 前回ワールド変換の計算に使用されたフレームの変換行列の保存 */
2727 std::vector<D3DXMATRIX> _prevTransformationMatrixList;
28-
29- std::map<FrameWorldMatrix*, std::vector<ID3DXAnimationSet*>>* _pModel_MapBornFrame_AnimationSetList;
30- ID3DXAnimationSet* _pAs0;
31- ID3DXAnimationSet* _pAs1;
28+ bool** _papaBool_Model_AnimationSetIndex_BoneFrameIndex_is_act;
29+ int _as0_index;
30+ int _as1_index;
3231 public:
3332 WorldMatStack();
3433 virtual ~WorldMatStack();
3534 virtual void registerFrameTransformationMatrix(FrameWorldMatrix* pFrame);
3635 virtual void SetWorldMatrix( D3DXMATRIX* worldmat );
37- virtual void UpdateFrame(FrameWorldMatrix* prm_frame_world, ID3DXAnimationSet* prm_pAs1 = nullptr, ID3DXAnimationSet* prm_pAs2= nullptr);
36+ virtual void UpdateFrame(FrameWorldMatrix* prm_frame_world, int prm_as0_index = -1, int prm_as1_index = -1);
3837
3938 protected:
4039 void CalcFrameWorldMatrix(FrameWorldMatrix* frame_world); // フレームワールド行列算出再帰関数
--- a/GgafDx/src/jp/ggaf/dx/actor/AniMeshActor.cpp
+++ b/GgafDx/src/jp/ggaf/dx/actor/AniMeshActor.cpp
@@ -35,8 +35,8 @@ _stackWorldMat() {
3535 ID3DXAnimationController* pAc_cloned = _pAniMeshModel->getCloneAnimationController();
3636 _pPuppeteer = NEW Puppeteer(pAc_cloned);
3737 //Frame
38- _stackWorldMat._pModel_MapBornFrame_AnimationSetList = &(_pAniMeshModel->_mapBornFrame_AnimationSetList);
39-
38+// _stackWorldMat._pModel_MapBoneFrameIndex_ActAnimationSetIndexList = &(_pAniMeshModel->_mapBoneFrameIndex_ActAnimationSetIndexList);
39+ _stackWorldMat._papaBool_Model_AnimationSetIndex_BoneFrameIndex_is_act = _pAniMeshModel->_papaBool_AnimationSetIndex_BoneFrameIndex_is_act;
4040 FrameWorldMatrix* pFrameRoot = _pAniMeshModel->_pFrameRoot;
4141 _stackWorldMat.registerFrameTransformationMatrix(pFrameRoot);
4242
--- a/GgafDx/src/jp/ggaf/dx/model/AniMeshModel.cpp
+++ b/GgafDx/src/jp/ggaf/dx/model/AniMeshModel.cpp
@@ -15,7 +15,7 @@
1515 #include "jp/ggaf/dx/texture/Texture.h"
1616 #include "jp/ggaf/dx/util/AllocHierarchyWorldFrame.h"
1717
18-#define MAX_FRAME_WORLD_MATRIX (8) //2以上でないとブレイクしないのでダメ
18+#define MAX_FRAME_WORLD_MATRIX (25) //2以上でないとブレイクしないのでダメ
1919
2020 using namespace GgafDx;
2121 DWORD AniMeshModel::FVF = (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_PSIZE | D3DFVF_DIFFUSE | D3DFVF_TEX1);
@@ -37,6 +37,8 @@ AniMeshModel::AniMeshModel(const char* prm_model_name) : Model(prm_model_name) {
3737 _size_vertex_unit = sizeof(AniMeshModel::VERTEX);
3838 _nFaces = 0;
3939 _nVertices = 0;
40+
41+ _papaBool_AnimationSetIndex_BoneFrameIndex_is_act = nullptr;
4042 _obj_model |= Obj_GgafDx_AniMeshModel;
4143 }
4244
@@ -81,7 +83,9 @@ HRESULT AniMeshModel::draw(FigureActor* prm_pActor_target, int prm_draw_set_num,
8183 pTargetActor->_stackWorldMat.SetWorldMatrix(&(pTargetActor->_matWorld));
8284 ID3DXAnimationSet* pAs0 = pActorPuppeteer->_paAs[0];
8385 ID3DXAnimationSet* pAs1 = pActorPuppeteer->_paAs[1];
84- pTargetActor->_stackWorldMat.UpdateFrame(_pFrameRoot, pAs0, pAs1);
86+ int as0_index = (int)_mapAnimationSet_AniSetindex[pAs0];
87+ int as1_index = pAs1 ? _mapAnimationSet_AniSetindex[pAs1] : -1;
88+ pTargetActor->_stackWorldMat.UpdateFrame(_pFrameRoot, as0_index, as1_index);
8589
8690 std::vector<FrameWorldMatrix*>::iterator it_1 = _vecDrawBoneFrame.begin();
8791
@@ -263,31 +267,47 @@ void AniMeshModel::restore() {
263267 hr = _pAniControllerBase->AdvanceTime(0, nullptr);
264268 checkDxException(hr, D3D_OK, "失敗しました。");
265269
266-
270+ _vecDrawBoneFrame.clear();
271+ _vecAllBoneFrame.clear();
272+ _tmp_frame_index = 0;
273+ setFrameInfo(_pFrameRoot); //フレームを廻り情報をメンバにセット
267274 //////
268- _vecAnimationSet.clear();
269-// _mapAnimationSet_AniSetindex.clear();
270- _mapAnimationSet_AnimationTargetBoneFrameNames.clear();
275+ _mapAnimationSet_AniSetindex.clear();
276+ _mapAnimationSetIndex_AnimationTargetBoneFrameNames.clear();
271277 _num_animation_set = _pAniControllerBase->GetMaxNumAnimationSets();
272278 for (UINT ani_set_index = 0; ani_set_index < _num_animation_set; ani_set_index++) {
273279 ID3DXAnimationSet* pAnimationSet = nullptr;
274280 hr = _pAniControllerBase->GetAnimationSet(ani_set_index, &(pAnimationSet)); //アニメーションセット保持
275281 checkDxException(hr, D3D_OK, "失敗しました");
276- _vecAnimationSet.push_back(pAnimationSet);
277-// _mapAnimationSet_AniSetindex[pAnimationSet] = ani_set_index;
282+ _mapAnimationSet_AniSetindex[pAnimationSet] = ani_set_index;
278283 int num_animation = pAnimationSet->GetNumAnimations();
279- for (int ani_index = 0; ani_index < num_animation; ++ani_index) {
284+ for (UINT ani_index = 0; ani_index < num_animation; ++ani_index) {
280285 LPCSTR target_bone_frame_name = nullptr;
281286 hr = pAnimationSet->GetAnimationNameByIndex(ani_index, &target_bone_frame_name);
282287 checkDxException(hr, D3D_OK, "失敗しました");
283- _mapAnimationSet_AnimationTargetBoneFrameNames[pAnimationSet].push_back(target_bone_frame_name);
284- _TRACE_("_mapAnimationSet_AnimationTargetBoneFrameNames["<<pAnimationSet<<"] = "<<target_bone_frame_name<<"");
288+ _mapAnimationSetIndex_AnimationTargetBoneFrameNames[ani_set_index].push_back(target_bone_frame_name);
289+
290+ }
291+ }
292+
293+ _papaBool_AnimationSetIndex_BoneFrameIndex_is_act = NEW bool*[_num_animation_set];
294+ for (UINT ani_set_index = 0; ani_set_index < _num_animation_set; ani_set_index++) {
295+ _papaBool_AnimationSetIndex_BoneFrameIndex_is_act[ani_set_index] = NEW bool[_tmp_frame_index+1];
296+ std::vector<LPCSTR>* pAnimationTargetBoneFrameNameList = &(_mapAnimationSetIndex_AnimationTargetBoneFrameNames[ani_set_index]);
297+ for (UINT frame_index = 0; frame_index < _vecAllBoneFrame.size(); frame_index++) {
298+ _papaBool_AnimationSetIndex_BoneFrameIndex_is_act[ani_set_index][frame_index] = false;
299+ LPSTR frame_name = _vecAllBoneFrame[frame_index]->Name;
300+ if (frame_name) {
301+ for (int n = 0; n < pAnimationTargetBoneFrameNameList->size(); n++) {
302+ LPCSTR animation_target_bone_frame_name = (*pAnimationTargetBoneFrameNameList)[n];
303+ if (strcmp(animation_target_bone_frame_name, frame_name) == 0) {
304+ _papaBool_AnimationSetIndex_BoneFrameIndex_is_act[ani_set_index][frame_index] = true;
305+ break;
306+ }
307+ }
308+ }
285309 }
286310 }
287- _vecDrawBoneFrame.clear();
288- _mapBornFrame_AnimationSetList.clear();
289- _tmp_frame_index = 0;
290- setFrameInfo(_pFrameRoot); //フレームを廻り情報をメンバにセット
291311
292312 //境界球
293313 D3DXVECTOR3 vecCenter;
@@ -478,10 +498,6 @@ void AniMeshModel::restore() {
478498 pMeshContainer->MeshData.pMesh = nullptr;
479499 }
480500
481-
482-
483-
484-
485501 ////////////////////////////////////////////////
486502 //描画時(DrawIndexedPrimitive)のパラメータリスト作成
487503 std::vector<AniMeshModel::INDEXPARAM> param_tmp;
@@ -694,34 +710,10 @@ int AniMeshModel::getAnimTicksPerSecond(std::string& prm_xfile_name) {
694710 }
695711
696712 void AniMeshModel::setFrameInfo(FrameWorldMatrix* prm_pFrame) {
697- //以下の情報を構築する
698- //・総アニメーションセットの配列、要素番号はアニメーションセットインデックスと呼称する
699- // std::vector<ID3DXAnimationSet*> _vecAnimationSet;
700- //・フレームから、そのフレームが対象となっているアニメーションセットの配列を得るMap
701- // std::map<FrameWorldMatrix*, std::vector<ID3DXAnimationSet*>> _mapBornFrame_AnimationSetList
702- //・AnimationSet から、AnimationのターゲットのBoneFrame の Nameの配列が取得できるマップ
703- // std::map<ID3DXAnimationSet*, std::vector<LPCSTR>> _mapAnimationSet_AnimationTargetBoneFrameNames
704- //・メッシュコンテナがある描画対象フレームを直列化したもの、要素番号はただの連番
705- // std::vector<FrameWorldMatrix*> _vecDrawBoneFrame;
706-
707713 prm_pFrame->_frame_index = _tmp_frame_index; //フレームインデックスを保持
708714 _tmp_frame_index++;
709- LPSTR frame_name = prm_pFrame->Name;
710- if (frame_name) {
711- //フレームから、そのフレームをアニメーションするアニメーションセットの配列を作成
712- std::vector<ID3DXAnimationSet*>* pAnimationSetList = &(_mapBornFrame_AnimationSetList[prm_pFrame]); //構築したい配列
713- for (UINT ani_set_index = 0; ani_set_index < _num_animation_set; ani_set_index++) {
714- ID3DXAnimationSet* pAnimationSet = _vecAnimationSet[ani_set_index];
715- std::vector<LPCSTR>* pAnimationTargetBoneFrameNameList = &(_mapAnimationSet_AnimationTargetBoneFrameNames[pAnimationSet]);
716- for (int n = 0; n < pAnimationTargetBoneFrameNameList->size(); n++) {
717- LPCSTR animation_target_bone_frame_name = (*pAnimationTargetBoneFrameNameList)[n];
718- if (strcmp(animation_target_bone_frame_name, frame_name) == 0) {
719- pAnimationSetList->push_back(pAnimationSet);
720- break;
721- }
722- }
723- }
724- }
715+
716+ _vecAllBoneFrame.push_back(prm_pFrame);
725717 if (prm_pFrame->pMeshContainer) {
726718 //メッシュコンテナ有り
727719 _vecDrawBoneFrame.push_back(prm_pFrame);
@@ -779,6 +771,11 @@ void AniMeshModel::release() {
779771 }
780772
781773 AniMeshModel::~AniMeshModel() {
774+ for (UINT ani_set_index = 0; ani_set_index < _num_animation_set; ani_set_index++) {
775+ bool* p = _papaBool_AnimationSetIndex_BoneFrameIndex_is_act[ani_set_index];
776+ GGAF_DELETEARR(p);
777+ }
778+ GGAF_DELETEARR(_papaBool_AnimationSetIndex_BoneFrameIndex_is_act);
782779 //release();
783780 //はModelConnection::processReleaseResource(Model* prm_pResource) で呼び出される
784781 }
--- a/GgafDx/src/jp/ggaf/dx/util/WorldMatStack.cpp
+++ b/GgafDx/src/jp/ggaf/dx/util/WorldMatStack.cpp
@@ -4,9 +4,10 @@
44 using namespace GgafDx;
55
66 WorldMatStack::WorldMatStack() : GgafCore::Object() {
7- _pModel_MapBornFrame_AnimationSetList = nullptr;
8- _pAs0 = nullptr;
9- _pAs1 = nullptr;
7+// _pModel_MapBoneFrameIndex_ActAnimationSetIndexList = nullptr;
8+ _papaBool_Model_AnimationSetIndex_BoneFrameIndex_is_act = nullptr;
9+ _as0_index = -1;
10+ _as1_index = -1;
1011 _prevTransformationMatrixList.clear();
1112 }
1213
@@ -29,7 +30,7 @@ void WorldMatStack::SetWorldMatrix(D3DXMATRIX* worldmat) {
2930 _actor_world_trans_matrix = *worldmat;
3031 }
3132
32-void WorldMatStack::UpdateFrame(FrameWorldMatrix* prm_frame_world, ID3DXAnimationSet* prm_pAs0, ID3DXAnimationSet* prm_pAs1) {
33+void WorldMatStack::UpdateFrame(FrameWorldMatrix* prm_frame_world, int prm_as0_index, int prm_as1_index) {
3334
3435 // スタックの初期化
3536 while (!m_MatrixStack.empty())
@@ -40,8 +41,8 @@ void WorldMatStack::UpdateFrame(FrameWorldMatrix* prm_frame_world, ID3DXAnimatio
4041
4142 // ワールド変換行列をスタックに積む
4243 m_MatrixStack.push(&_actor_world_trans_matrix);
43- _pAs0 = prm_pAs0;
44- _pAs1 = prm_pAs1;
44+ _as0_index = prm_as0_index;
45+ _as1_index = prm_as1_index;
4546 // ルートフレームからワールド変換行列を連続計算
4647 CalcFrameWorldMatrix(prm_frame_world);
4748 }
@@ -56,15 +57,11 @@ void WorldMatStack::CalcFrameWorldMatrix(FrameWorldMatrix* prm_pBoneFrame) {
5657 bool is_target_frame = false;
5758 LPSTR born_frame_name = prm_pBoneFrame->Name;
5859 if (born_frame_name) {
59- std::vector<ID3DXAnimationSet*>* pRelationAnimationSetList = &((*_pModel_MapBornFrame_AnimationSetList)[prm_pBoneFrame]);
60- int num_ani_set = pRelationAnimationSetList->size();
61- for (int i = 0; i < num_ani_set; ++i) {
62- ID3DXAnimationSet* pRelationAnimationSet = (*pRelationAnimationSetList)[i];
63- if (_pAs0 && _pAs0 == pRelationAnimationSet) {
64- is_target_frame = true;
65- } else if (_pAs1 && _pAs1 == pRelationAnimationSet) {
66- is_target_frame = true;
67- }
60+ if (_as0_index >= 0 && _papaBool_Model_AnimationSetIndex_BoneFrameIndex_is_act[_as0_index][prm_pBoneFrame->_frame_index]) {
61+ is_target_frame = true;
62+
63+ } else if (_as1_index >= 0 && _papaBool_Model_AnimationSetIndex_BoneFrameIndex_is_act[_as1_index][prm_pBoneFrame->_frame_index]) {
64+ is_target_frame = true;
6865 }
6966 }
7067
@@ -77,11 +74,6 @@ void WorldMatStack::CalcFrameWorldMatrix(FrameWorldMatrix* prm_pBoneFrame) {
7774 D3DXMatrixMultiply(&(prm_pBoneFrame->_world_trans_matrix), pMatrix, pStackMat);
7875 }
7976
80-// if (prm_pBoneFrame->pMeshContainer) {
81-// // 引数のフレームに対応するワールド変換行列を計算
82-// _vecDrawBoneFrame.push_back(prm_pBoneFrame);
83-// }
84-
8577 // 子フレームがあればスタックを積んで、子フレームのワールド変換座標の計算へ
8678 if (prm_pBoneFrame->pFrameFirstChild) {
8779 m_MatrixStack.push(&(prm_pBoneFrame->_world_trans_matrix));
--- a/VioletVreath/Version.h
+++ b/VioletVreath/Version.h
@@ -1 +1 @@
1-#define VERSION "VER 0.30.6715"
1+#define VERSION "VER 0.30.6717"