-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheff_shock-wave_00.cpp
More file actions
298 lines (253 loc) · 9.45 KB
/
Copy patheff_shock-wave_00.cpp
File metadata and controls
298 lines (253 loc) · 9.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
//========================================
//
// EFF:衝撃波[00] の関連の処理
// Author:RIKU NISHIMURA
//
//========================================
// *** eff_shock-wave_00.cpp ***
//========================================
#include "main.h"
#include "color.h"
#include "eff_shock-wave_00.h"
//****************************************
// マクロ定義
//****************************************
#define EFF_SHOCKWAVE_00_MAX (16) // EFF:衝撃波[00] の最大数
#define EFF_SHOCKWAVE_00_DIVISION (16) // EFF:衝撃波[00] の分割数
// EFF:衝撃波[00] の法線ベクトル
#define EFF_SHOCKWAVE_00_NOR D3DXVECTOR3(0.0f,1.0f,0.0f)
//****************************************
// 構造体の定義
//****************************************
typedef struct
{
D3DXVECTOR3 pos; // 位置
D3DXVECTOR3 rot; // 向き
bool bUse; // 使用されているかフラグ
int nLife; // 寿命
int nLifeMax; // 寿命の最大値
float fRadius; // 半径
float fThickness; // 太さ
float fEdgeHeight; // 縁の高さ
Color inCol; // 内側の色
Color outCol; // 外側の色
}Eff_shockWave_00;
//****************************************
// プロトタイプ宣言
//****************************************
// EFF:衝撃波[00] のパラメーター初期化処理
void InitParameterEff_shockWave_00(Eff_shockWave_00 *pEff);
//****************************************
// グローバル宣言
//****************************************
LPDIRECT3DVERTEXBUFFER9 g_pVtxBuffEff_shockWave_00 // EFF:衝撃波[00] の頂点バッファへのポインタ
= NULL;
D3DXMATRIX g_mtxWorldEff_shockWave_00; // EFF:衝撃波[00] のワールドマトリックス
Eff_shockWave_00 g_aEff_shockWave_00 // EFF:衝撃波[00] の情報
[EFF_SHOCKWAVE_00_MAX];
//================================================================================
//----------|---------------------------------------------------------------------
//==========| cppファイルの占有関数
//----------|---------------------------------------------------------------------
//================================================================================
//========================================
// InitParameterEff_shockWave_00関数 - EFF:衝撃波[00] のパラメーター初期化処理 -
//========================================
void InitParameterEff_shockWave_00(Eff_shockWave_00 *pEff)
{
pEff->pos = ZERO_SET; // 位置
pEff->rot = ZERO_SET; // 向き
pEff->bUse = false; // 使用されているかフラグ
pEff->nLife = 0; // 寿命
pEff->nLifeMax = 0; // 寿命の最大値
pEff->fRadius = 0.0f; // 半径
pEff->fThickness = 0.0f; // 太さ
pEff->fEdgeHeight = 0.0f; // 縁の高さ
pEff->inCol = {0,0,0,0}; // 色
}
//================================================================================
//----------|---------------------------------------------------------------------
//==========| hファイルの共有関数
//----------|---------------------------------------------------------------------
//================================================================================
//========================================
// InitEff_shockWave_00関数 - EFF:衝撃波[00] の初期化処理 -
//========================================
void InitEff_shockWave_00(void)
{
LPDIRECT3DDEVICE9 pDevice // デバイス取得
= GetDevice();
// 頂点バッファの生成
pDevice->CreateVertexBuffer(sizeof(VERTEX_3D) * ((EFF_SHOCKWAVE_00_DIVISION + 1) * 2) * EFF_SHOCKWAVE_00_MAX,
D3DUSAGE_WRITEONLY,
FVF_VERTEX_3D,
D3DPOOL_MANAGED,
&g_pVtxBuffEff_shockWave_00,
NULL);
VERTEX_3D *pVtx; //頂点情報へのポインタ
// 頂点バッファをロックし、頂点情報へのポインタを取得
g_pVtxBuffEff_shockWave_00->Lock(0, 0, (void**)&pVtx, 0);
Eff_shockWave_00 *pEff // EFF:衝撃波[00] の情報構造体
= g_aEff_shockWave_00;
for (int nCntEff = 0; nCntEff < EFF_SHOCKWAVE_00_MAX; nCntEff++,pEff++)
{
// パラメーターの初期化処理
InitParameterEff_shockWave_00(pEff);
for (int nCntVtx = 0; nCntVtx < (EFF_SHOCKWAVE_00_DIVISION + 1) * 2; nCntVtx++, pVtx++)
{
pVtx->nor = EFF_SHOCKWAVE_00_NOR;
}
}
// 頂点バッファをアンロックする
g_pVtxBuffEff_shockWave_00->Unlock();
}
//========================================
// UninitEff_shockWave_00関数 - EFF:衝撃波[00] の終了処理 -
//========================================
void UninitEff_shockWave_00(void)
{
//頂点バッファの破棄
if (g_pVtxBuffEff_shockWave_00 != NULL)
{
g_pVtxBuffEff_shockWave_00->Release();
g_pVtxBuffEff_shockWave_00 = NULL;
}
}
//========================================
// UpdateEff_shockWave_00関数 - EFF:衝撃波[00] の更新処理 -
//========================================
void UpdateEff_shockWave_00(void)
{
VERTEX_3D *pVtx; //頂点情報へのポインタ
// 頂点バッファをロックし、頂点情報へのポインタを取得
g_pVtxBuffEff_shockWave_00->Lock(0, 0, (void**)&pVtx, 0);
Eff_shockWave_00 *pEff // EFF:衝撃波[00] の情報のポインタ
= g_aEff_shockWave_00;
for (int nCntEff = 0; nCntEff < EFF_SHOCKWAVE_00_MAX; nCntEff++, pEff++, pVtx += ((EFF_SHOCKWAVE_00_DIVISION + 1) * 2))
{
if (!pEff->bUse)
{// 使用されている状態でない時、
// 繰り返し処理を折り返す
continue;
}
else if (--pEff->nLife <= 0)
{// 寿命を減算した結果0以下の時、
pEff->bUse = false; // 使用されていない状態にする
continue; // 繰り返し処理を折り返す
}
for (int nCntDiv = 0; nCntDiv < EFF_SHOCKWAVE_00_DIVISION + 1; nCntDiv++)
{
float fSetAngle = nCntDiv * (D3DX_PI / (float)EFF_SHOCKWAVE_00_DIVISION) * 2;
int nStartVtx = nCntDiv * 2;
float fLifeRate = (float)pEff->nLife / (float)pEff->nLifeMax;
float fRadius = pEff->fRadius * (1.0f - fLifeRate);
// 内側の頂点座標を設定
{
float fDistance = fRadius - pEff->fThickness;
if (fDistance <= 0.0f)
{// 距離が0以下の時、0に制御
fDistance = 0.0f;
}
pVtx[nStartVtx].pos.x = sinf(fSetAngle) * (fDistance);
pVtx[nStartVtx].pos.z = cosf(fSetAngle) * (fDistance);
}
// 外側の頂点座標を設定
pVtx[nStartVtx + 1].pos.x = sinf(fSetAngle) * fRadius;
pVtx[nStartVtx + 1].pos.z = cosf(fSetAngle) * fRadius;
pVtx[nStartVtx + 1].pos.y = pEff->fEdgeHeight;
// 色を設定
pVtx[nStartVtx].col =
D3DCOLOR_RGBA(
pEff->inCol.r,
pEff->inCol.g,
pEff->inCol.b,
(int)(pEff->inCol.a * fLifeRate));
pVtx[nStartVtx + 1].col =
D3DCOLOR_RGBA(
pEff->outCol.r,
pEff->outCol.g,
pEff->outCol.b,
(int)(pEff->outCol.a * fLifeRate));
}
}
// 頂点バッファをアンロックする
g_pVtxBuffEff_shockWave_00->Unlock();
}
//========================================
// DrawEff_shockWave_00関数 - EFF:衝撃波[00] の描画処理 -
//========================================
void DrawEff_shockWave_00(void)
{
LPDIRECT3DDEVICE9 pDevice = GetDevice(); // デバイス取得
D3DXMATRIX mtxRot, mtxTrans; // 計算用マトリックス
Eff_shockWave_00 *pEff = g_aEff_shockWave_00; // EFF:衝撃波[00] の情報構造体
// 頂点バッファをデータストリームに設定
pDevice->SetStreamSource(0, g_pVtxBuffEff_shockWave_00, 0, sizeof(VERTEX_3D));
// 頂点フォーマットの設定
pDevice->SetFVF(FVF_VERTEX_3D);
// テクスチャの設定
pDevice->SetTexture(0, NULL);
//両面カリングをON
pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
//ライティングをオフにする
pDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
//アルファテストを有効にする
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
pDevice->SetRenderState(D3DRS_ALPHAREF, 40);
for (int nCntEff = 0; nCntEff < EFF_SHOCKWAVE_00_MAX; nCntEff++, pEff++)
{
if ((!pEff->bUse) || (pEff->nLife == pEff->nLifeMax))
{// 使用されていない状態 or 寿命が最大値に等しい時、
continue; // 処理を折り返す
}
// ワールドマトリックスの初期化
D3DXMatrixIdentity(&g_mtxWorldEff_shockWave_00);
// 向きを反映
D3DXMatrixRotationYawPitchRoll(&mtxRot, pEff->rot.y, pEff->rot.x, pEff->rot.z);
D3DXMatrixMultiply(&g_mtxWorldEff_shockWave_00, &g_mtxWorldEff_shockWave_00, &mtxRot);
// 位置を反映
D3DXMatrixTranslation(&mtxTrans, pEff->pos.x, pEff->pos.y, pEff->pos.z);
D3DXMatrixMultiply(&g_mtxWorldEff_shockWave_00, &g_mtxWorldEff_shockWave_00, &mtxTrans);
// ワールドマトリックスの設定
pDevice->SetTransform(D3DTS_WORLD, &g_mtxWorldEff_shockWave_00);
// ポリゴンの描画
pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, ((EFF_SHOCKWAVE_00_DIVISION + 1) * 2) * nCntEff, (EFF_SHOCKWAVE_00_DIVISION * 2));
}
//ライティングをオンにする
pDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
//アルファテストを有効にする
pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER);
pDevice->SetRenderState(D3DRS_ALPHAREF, 40);
//普通のカリングモードにする
pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
}
//========================================
// SetEff_shockWave_00関数 - EFF:衝撃波[00] の設定処理 -
//========================================
void SetEff_shockWave_00(D3DXVECTOR3 pos, D3DXVECTOR3 rot, float fRadius, float fThickness, float fEdgeHeight,Color inCol, Color outCol, int nLife)
{
Eff_shockWave_00 *pEff // EFF:衝撃波[00] の情報のポインタ
= g_aEff_shockWave_00;
for (int nCntEff = 0; nCntEff < EFF_SHOCKWAVE_00_MAX; nCntEff++, pEff++)
{
if (pEff->bUse)
{// 使用されている状態の時、
// 処理を折り返す
continue;
}
pEff->pos = pos; // 位置を代入
pEff->rot = rot; // 向きを代入
pEff->fRadius = fRadius; // 半径を代入
pEff->fThickness = fThickness; // 太さを代入
pEff->fEdgeHeight = fEdgeHeight; // 縁の高さを代入
pEff->inCol = inCol; // 内側の色を代入
pEff->outCol = outCol; // 外側の色を代入
pEff->nLife = // 寿命を代入
pEff->nLifeMax = nLife; // 寿命の最大値を代入
pEff->bUse = true; // 使用されている状態にする
// 繰り返し処理を抜ける
break;
}
}