1 | #include "dxstdafx.h"
|
---|
2 | #include "media.h"
|
---|
3 | #include ".\Explosion.h"
|
---|
4 |
|
---|
5 | Explosion::Explosion(void)
|
---|
6 | {
|
---|
7 | pSys.addSystem(PARTICLE_SYSTEM_1, true, D3DCOLOR_COLORVALUE(1.0f, 0.0f, 0.0f, 1.0f), 1.8, 2.2);
|
---|
8 | pSys.addSystem(PARTICLE_SYSTEM_2, false, D3DCOLOR_COLORVALUE( 0.0f, 1.0f, 0.0f, 0.2f), 2.8, 3.5);
|
---|
9 | pSys.addSystem(PARTICLE_SYSTEM_3, false, D3DCOLOR_COLORVALUE(0.0f, 0.0f, 1.0f, 0.015f), 9.0, 10.2);
|
---|
10 | }
|
---|
11 |
|
---|
12 | Explosion::~Explosion(void)
|
---|
13 | {
|
---|
14 | }
|
---|
15 |
|
---|
16 | void Explosion::OnCreateDevice( IDirect3DDevice9* pd3dDevice)
|
---|
17 | {
|
---|
18 |
|
---|
19 | this->pd3dDevice = pd3dDevice;
|
---|
20 |
|
---|
21 | mesh = new Mesh(SCENE_MESH, 1, D3DXVECTOR3(0,0,0));
|
---|
22 |
|
---|
23 | ID3DXBuffer* errBuff = NULL;
|
---|
24 | if( FAILED(D3DXCreateEffectFromFile( pd3dDevice, L"Media//Shaders/Scene.fx", NULL, NULL, NULL,
|
---|
25 | NULL, &g_pEffect, &errBuff )))
|
---|
26 | {
|
---|
27 | int BufSize = errBuff->GetBufferSize();
|
---|
28 |
|
---|
29 | // displaying error message of arbitrary length
|
---|
30 | wchar_t* wbuf = new wchar_t[BufSize];
|
---|
31 | mbstowcs( wbuf, (const char*)errBuff->GetBufferPointer(), BufSize );
|
---|
32 | MessageBox(NULL, wbuf, L".fx Compilation Error", MB_ICONERROR); // show error message
|
---|
33 |
|
---|
34 | delete wbuf;
|
---|
35 | exit(-1);
|
---|
36 | }
|
---|
37 |
|
---|
38 | pSys.OnCreateDevice(pd3dDevice);
|
---|
39 |
|
---|
40 | }
|
---|
41 |
|
---|
42 | void Explosion::OnDestroyDevice()
|
---|
43 | {
|
---|
44 | delete mesh;
|
---|
45 | SAFE_RELEASE( g_pEffect );
|
---|
46 |
|
---|
47 | pSys.OnDestroyDevice();
|
---|
48 | }
|
---|
49 |
|
---|
50 | void Explosion::OnResetDevice(const D3DSURFACE_DESC* pBackBufferDesc )
|
---|
51 | {
|
---|
52 | m_ScreenWidth = pBackBufferDesc->Width;
|
---|
53 | m_ScreenHeight = pBackBufferDesc->Height;
|
---|
54 |
|
---|
55 |
|
---|
56 | if( g_pEffect )
|
---|
57 | g_pEffect->OnResetDevice();
|
---|
58 |
|
---|
59 | D3DXCreateTextureFromFile( pd3dDevice, COLOR_TEXTURE_PATH, &ColorTexture );
|
---|
60 |
|
---|
61 | FrameBufferTexture = new CDXTexture();
|
---|
62 | if (!FrameBufferTexture->InitTex(pd3dDevice, "framebuffer", m_ScreenWidth, m_ScreenHeight, D3DFMT_A16B16G16R16F, false))
|
---|
63 | {
|
---|
64 | MessageBox(NULL, L"FrameBufferTexture creation failed!",L"", MB_OK);
|
---|
65 | }
|
---|
66 | ParticleTexture = new CDXTexture();
|
---|
67 |
|
---|
68 | createParticleTex();
|
---|
69 |
|
---|
70 | PhaseTexture = new CDXTexture();
|
---|
71 | if (!PhaseTexture->InitTex(pd3dDevice, "phaseTexture", 256, 256, D3DFMT_A16B16G16R16F, false))
|
---|
72 | {
|
---|
73 | MessageBox(NULL, L"PhaseTexture creation failed!",L"", MB_OK);
|
---|
74 | }
|
---|
75 | phaseCreated = false;
|
---|
76 |
|
---|
77 | pSys.setScreenDimensions(m_ScreenWidth, m_ScreenHeight);
|
---|
78 |
|
---|
79 | // create vertex buffer for full-screen quad
|
---|
80 | pd3dDevice->CreateVertexBuffer(sizeof(float) * 18, D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_DEFAULT, &FullScreenQuad, 0);
|
---|
81 | float* snipet;
|
---|
82 | FullScreenQuad->Lock(0, 0, (void**)&snipet, D3DLOCK_DISCARD);
|
---|
83 | int index = 0;
|
---|
84 | snipet[index++] = -1; snipet[index++] = -1; snipet[index++] = 0;
|
---|
85 | snipet[index++] = 1; snipet[index++] = 1; snipet[index++] = 0;
|
---|
86 | snipet[index++] = 1; snipet[index++] = -1; snipet[index++] = 0;
|
---|
87 |
|
---|
88 | snipet[index++] = -1; snipet[index++] = -1; snipet[index++] = 0;
|
---|
89 | snipet[index++] = -1; snipet[index++] = 1; snipet[index++] = 0;
|
---|
90 | snipet[index++] = 1; snipet[index++] = 1; snipet[index++] = 0;
|
---|
91 |
|
---|
92 | FullScreenQuad->Unlock();
|
---|
93 |
|
---|
94 |
|
---|
95 | pSys.OnResetDevice();
|
---|
96 | }
|
---|
97 |
|
---|
98 | void Explosion::OnLostDevice()
|
---|
99 | {
|
---|
100 | if( g_pEffect )
|
---|
101 | g_pEffect->OnLostDevice();
|
---|
102 |
|
---|
103 | SAFE_RELEASE(ColorTexture);
|
---|
104 | SAFE_RELEASE(FullScreenQuad);
|
---|
105 |
|
---|
106 | delete FrameBufferTexture;
|
---|
107 | destroyParticleTex();
|
---|
108 | delete PhaseTexture;
|
---|
109 |
|
---|
110 | pSys.OnLostDevice();
|
---|
111 | }
|
---|
112 |
|
---|
113 | void Explosion::destroyParticleTex()
|
---|
114 | {
|
---|
115 | delete ParticleTexture;
|
---|
116 | delete HeatTexture;
|
---|
117 | }
|
---|
118 |
|
---|
119 | void Explosion::createParticleTex()
|
---|
120 | {
|
---|
121 | int width, height;
|
---|
122 | int ratio = params->GetInt(fTexRatio);
|
---|
123 | lastRatio = ratio;
|
---|
124 | float r = pow(2.0, ratio);
|
---|
125 | r = 1.0 / r;
|
---|
126 | width = m_ScreenWidth * r;
|
---|
127 | height = m_ScreenHeight * r;
|
---|
128 | ParticleTexture = new CDXTexture();
|
---|
129 | if (!ParticleTexture->InitTex(pd3dDevice, "particleColor", width, height, D3DFMT_A16B16G16R16F, false))
|
---|
130 | {
|
---|
131 | MessageBox(NULL, L"ParticleColorTexture creation failed!",L"", MB_OK);
|
---|
132 | }
|
---|
133 | HeatTexture = new CDXTexture();
|
---|
134 | if (!HeatTexture->InitTex(pd3dDevice, "particleHeat", width, height, D3DFMT_A16B16G16R16F, false))
|
---|
135 | {
|
---|
136 | MessageBox(NULL, L"ParticleHeatTexture creation failed!",L"", MB_OK);
|
---|
137 | }
|
---|
138 | }
|
---|
139 |
|
---|
140 | void Explosion::slidersChanged()
|
---|
141 | {
|
---|
142 | int ratio = params->GetInt(fTexRatio);
|
---|
143 | if(ratio != lastRatio)
|
---|
144 | {
|
---|
145 | destroyParticleTex();
|
---|
146 | createParticleTex();
|
---|
147 | }
|
---|
148 | }
|
---|
149 |
|
---|
150 | void Explosion::renderPhaseTexture()
|
---|
151 | {
|
---|
152 | PhaseTexture->StartRender();
|
---|
153 |
|
---|
154 | D3DCOLOR backgroundColor = D3DCOLOR_ARGB(0, 0, 0, 0);
|
---|
155 | V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, backgroundColor, 1.0f, 0) );
|
---|
156 |
|
---|
157 |
|
---|
158 | UINT p;
|
---|
159 | g_pEffect->SetTechnique("Phase");
|
---|
160 | g_pEffect->Begin(&p, 0 );
|
---|
161 | g_pEffect->BeginPass( 0 );
|
---|
162 |
|
---|
163 | pd3dDevice->SetStreamSource(0, FullScreenQuad, 0, sizeof(float) * 3);
|
---|
164 | pd3dDevice->SetFVF(D3DFVF_XYZ);
|
---|
165 | pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
|
---|
166 |
|
---|
167 | g_pEffect->EndPass();
|
---|
168 | g_pEffect->End();
|
---|
169 |
|
---|
170 | PhaseTexture->EndRender();
|
---|
171 |
|
---|
172 | phaseCreated = true;
|
---|
173 | }
|
---|
174 |
|
---|
175 | void Explosion::OnFrameRender( D3DXMATRIXA16& mView, D3DXMATRIXA16& mProj )
|
---|
176 | {
|
---|
177 | if(!phaseCreated)
|
---|
178 | renderPhaseTexture();
|
---|
179 |
|
---|
180 | FrameBufferTexture->StartRender(true, 0);
|
---|
181 |
|
---|
182 | D3DCOLOR backgroundColor = D3DCOLOR_ARGB(0, 0, 0, 0);
|
---|
183 | V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, backgroundColor, 1.0f, 0) );
|
---|
184 |
|
---|
185 | D3DXMATRIXA16 mWorld;
|
---|
186 |
|
---|
187 |
|
---|
188 | D3DXMatrixIdentity(&mWorld);
|
---|
189 |
|
---|
190 | SetWorldViewProj(mWorld,mView,mProj);
|
---|
191 | pSys.SetWorldViewProj(mWorld,mView,mProj);
|
---|
192 |
|
---|
193 |
|
---|
194 | g_pEffect->SetTexture("ColorMap",ColorTexture);
|
---|
195 | float lp[]={LightPos->x,LightPos->y,LightPos->z};
|
---|
196 | g_pEffect->SetFloatArray("mLightPos",lp,3);
|
---|
197 | float cp[]={camera->GetEyePt()->x,camera->GetEyePt()->y,camera->GetEyePt()->z};
|
---|
198 | g_pEffect->SetFloatArray("mCameraPos",cp,3);
|
---|
199 | g_pEffect->CommitChanges();
|
---|
200 |
|
---|
201 |
|
---|
202 | //rendertarget = scenetarget
|
---|
203 |
|
---|
204 | UINT p;
|
---|
205 | g_pEffect->SetTechnique("NOSHADING");
|
---|
206 | g_pEffect->Begin(&p, 0 );
|
---|
207 | g_pEffect->BeginPass( 0 );
|
---|
208 |
|
---|
209 | if(params->Get(bObjectOn))
|
---|
210 | mesh->Draw();
|
---|
211 |
|
---|
212 | g_pEffect->EndPass();
|
---|
213 | g_pEffect->End();
|
---|
214 |
|
---|
215 | FrameBufferTexture->EndRender();
|
---|
216 |
|
---|
217 | ParticleTexture->StartRender(false, 0);
|
---|
218 | HeatTexture->StartRender(false, 1);
|
---|
219 |
|
---|
220 | backgroundColor = D3DCOLOR_ARGB(0, 0, 0, 0);
|
---|
221 | V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, backgroundColor, 1.0f, 0) );
|
---|
222 |
|
---|
223 | pSys.setCameraPosition(*camera->GetEyePt());
|
---|
224 | pSys.draw(FrameBufferTexture->m_Tex, PhaseTexture->m_Tex);
|
---|
225 | if(!params->Get(bPaused))
|
---|
226 | pSys.stepFrame();
|
---|
227 |
|
---|
228 | ParticleTexture->EndRender();
|
---|
229 | HeatTexture->EndRender();
|
---|
230 |
|
---|
231 | g_pEffect->SetFloat( "fireTemperature", pSys.getFireTemperature());
|
---|
232 | g_pEffect->SetTexture( "PlanckColors", pSys.getPlanckTexture());
|
---|
233 | g_pEffect->SetTexture("SceneTexture", FrameBufferTexture->m_Tex);
|
---|
234 | g_pEffect->SetTexture("ParticleTexture", ParticleTexture->m_Tex);
|
---|
235 | g_pEffect->SetTexture("HeatTexture", HeatTexture->m_Tex);
|
---|
236 | //g_pEffect->SetTexture("HeatTexture", PhaseTexture->m_Tex);
|
---|
237 | float shimmerOffset = params->Get(fShimmerAmount) / 20.0;
|
---|
238 | g_pEffect->SetFloat("shimmerOffset", shimmerOffset);
|
---|
239 | float bluramount = 1.0 - params->Get(fMotionBlur);
|
---|
240 | g_pEffect->SetFloat("motionBlur", bluramount);
|
---|
241 | g_pEffect->CommitChanges();
|
---|
242 |
|
---|
243 | g_pEffect->SetTechnique("FullScreen");
|
---|
244 | g_pEffect->Begin(&p, 0 );
|
---|
245 | g_pEffect->BeginPass( 0 );
|
---|
246 |
|
---|
247 | pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
---|
248 | pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
---|
249 | pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
---|
250 | pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
|
---|
251 |
|
---|
252 | pd3dDevice->SetStreamSource(0, FullScreenQuad, 0, sizeof(float) * 3);
|
---|
253 | pd3dDevice->SetFVF(D3DFVF_XYZ);
|
---|
254 | pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
|
---|
255 |
|
---|
256 | pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
|
---|
257 | pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
|
---|
258 | g_pEffect->EndPass();
|
---|
259 | g_pEffect->End();
|
---|
260 | }
|
---|
261 |
|
---|
262 | void Explosion::addUiParams(Parameters& p)
|
---|
263 | {
|
---|
264 | pSys.setParams(p);
|
---|
265 | params=&p;
|
---|
266 | p.Add( fFireColor, "Fire temperature", 100);
|
---|
267 | p.Add( fFireIntensity, "Fire density", 100);
|
---|
268 | p.Add( fSmokeIntensity, "Smoke density", 100);
|
---|
269 | p.Add( fDustIntensity, "Dust density", 100);
|
---|
270 | p.Add( fShimmerAmount, "ShimmerAmount", 100);
|
---|
271 | p.Add( fTexRatio, "Rendertexture ratio", 4);
|
---|
272 | p.Add( fMotionBlur, "Motion blur amount", 100);
|
---|
273 |
|
---|
274 |
|
---|
275 |
|
---|
276 | }
|
---|
277 |
|
---|
278 | void Explosion::SetWorldViewProj(D3DXMATRIXA16& mWorld, D3DXMATRIXA16& mView, D3DXMATRIXA16& mProj )
|
---|
279 | {
|
---|
280 | D3DXMATRIXA16 mWorldView = mWorld * mView;
|
---|
281 | D3DXMATRIXA16 mWorldViewProjection = mWorldView * mProj;
|
---|
282 |
|
---|
283 | D3DXMATRIXA16 mWorldViewI, mWorldViewIT;
|
---|
284 | D3DXMatrixInverse(&mWorldViewI, NULL, &mWorldView);
|
---|
285 | D3DXMatrixTranspose(&mWorldViewIT, &mWorldViewI);
|
---|
286 |
|
---|
287 | V( g_pEffect->SetMatrix( "WorldView", &mWorldView ) );
|
---|
288 | V( g_pEffect->SetMatrix( "WorldViewIT", &mWorldViewIT ) );
|
---|
289 | V( g_pEffect->SetMatrix( "WorldViewProj", &mWorldViewProjection ) );
|
---|
290 | V( g_pEffect->SetMatrix( "Proj", &mWorldViewProjection ) );
|
---|
291 | V( g_pEffect->CommitChanges() );
|
---|
292 | }
|
---|
293 |
|
---|