📄 ch18p2_particleprops.cpp
字号:
/*
#############################################################################
Ch18p2_ParticleProps.cpp: a program that demonstrates how to create a
particle system editor.
#############################################################################
*/
// include files ////////////////////////////////////////////////////////////
#define STRICT
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <D3DX8.h>
#include "D3DApp.h"
#include "D3DFile.h"
#include "D3DFont.h"
#include "D3DUtil.h"
#include "DXUtil.h"
#include "D3DHelperFuncs.h"
#include "Ch18p2_resource.h"
#include "GroundPlane.h"
#include "Camera.h"
#include "InputManager.h"
#include "Ch18p2_ParticleEmitter.h"
//-----------------------------------------------------------------------------
// Name: class CMyD3DApplication
// Desc: Application class. The base class (CD3DApplication) provides the
// generic functionality needed in all Direct3D samples. CMyD3DApplication
// adds functionality specific to this sample program.
//-----------------------------------------------------------------------------
class CMyD3DApplication : public CD3DApplication
{
// Font for drawing text
CD3DFont* m_pFont;
CD3DFont* m_pFontSmall;
// Scene
CGroundPlane m_Ground;
CUserControlledCamera m_Camera;
// Mouse Input
CInputManager m_InputManager;
// The Particle System
CParticleEmitter m_PartSys;
// dialog box window handle
HWND m_hWndPropDlg;
protected:
HRESULT OneTimeSceneInit();
HRESULT InitDeviceObjects();
HRESULT RestoreDeviceObjects();
HRESULT InvalidateDeviceObjects();
HRESULT DeleteDeviceObjects();
HRESULT FinalCleanup();
HRESULT Render();
HRESULT FrameMove();
HRESULT ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior, D3DFORMAT Format );
LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
void ProcessInput();
public:
CMyD3DApplication();
// is the ground shown?
bool m_bShowGround;
};
CMyD3DApplication* g_pD3DApp = NULL;
CParticleEmitter *g_theSystem = NULL;
void PopulateAlphaBlendingComboBox(HWND hWnd, UINT idCombo)
{
SendMessage(GetDlgItem(hWnd, idCombo), CB_RESETCONTENT, 0, 0);
for (int q=0; q < CParticleEmitter::NUMBLENDINGMODES; q++) {
SendMessage(GetDlgItem(hWnd, idCombo), CB_ADDSTRING, 0, (long)(g_theSystem->m_BlendingModes[q].name));
SendMessage(GetDlgItem(hWnd, idCombo), CB_SETITEMDATA, q, g_theSystem->m_BlendingModes[q].mode);
}
}
void SelectBlendModeInComboBox(HWND hWnd, UINT idCombo, int blendmode)
{
for (int q=0; q < CParticleEmitter::NUMBLENDINGMODES; q++) {
int data = SendMessage(GetDlgItem(hWnd, idCombo), CB_GETITEMDATA, q, 0);
if (data == blendmode) {
SendMessage(GetDlgItem(hWnd, idCombo), CB_SETCURSEL, q, 0);
}
}
}
int GetCurSelDataFromComboBox(HWND hWnd, UINT idCombo)
{
int ndx = SendMessage(GetDlgItem(hWnd, idCombo), CB_GETCURSEL, 0, 0);
int data = 0;
if (ndx >= 0) {
data = SendMessage(GetDlgItem(hWnd, idCombo), CB_GETITEMDATA, ndx, 0);
}
return(data);
}
D3DXVECTOR3 Stuff3EditsIntoVector(HWND hWnd, UINT idX, UINT idY, UINT idZ)
{
char buf[256];
float fX, fY, fZ;
GetWindowText(GetDlgItem(hWnd, idX), buf, sizeof(buf)); fX = atof(buf);
GetWindowText(GetDlgItem(hWnd, idY), buf, sizeof(buf)); fY = atof(buf);
GetWindowText(GetDlgItem(hWnd, idZ), buf, sizeof(buf)); fZ = atof(buf);
return(D3DXVECTOR3(fX,fY,fZ));
}
void StuffVectorInto3Edits(D3DXVECTOR3 vector, HWND hWnd, UINT idX, UINT idY, UINT idZ)
{
char buf[256];
_snprintf(buf, sizeof(buf), "%.1f", vector.x); SetWindowText(GetDlgItem(hWnd, idX), buf);
_snprintf(buf, sizeof(buf), "%.1f", vector.y); SetWindowText(GetDlgItem(hWnd, idY), buf);
_snprintf(buf, sizeof(buf), "%.1f", vector.z); SetWindowText(GetDlgItem(hWnd, idZ), buf);
}
D3DXCOLOR Stuff4EditsIntoColor(HWND hWnd, UINT idR, UINT idG, UINT idB, UINT idA)
{
char buf[256];
float fR, fG, fB, fA;
GetWindowText(GetDlgItem(hWnd, idR), buf, sizeof(buf)); fR = atof(buf);
GetWindowText(GetDlgItem(hWnd, idG), buf, sizeof(buf)); fG = atof(buf);
GetWindowText(GetDlgItem(hWnd, idB), buf, sizeof(buf)); fB = atof(buf);
GetWindowText(GetDlgItem(hWnd, idA), buf, sizeof(buf)); fA = atof(buf);
return(D3DXCOLOR(fR,fG,fB,fA));
}
void StuffColorInto4Edits(D3DXCOLOR color, HWND hWnd, UINT idR, UINT idG, UINT idB, UINT idA)
{
char buf[256];
_snprintf(buf, sizeof(buf), "%.1f", color.r); SetWindowText(GetDlgItem(hWnd, idR), buf);
_snprintf(buf, sizeof(buf), "%.1f", color.g); SetWindowText(GetDlgItem(hWnd, idG), buf);
_snprintf(buf, sizeof(buf), "%.1f", color.b); SetWindowText(GetDlgItem(hWnd, idB), buf);
_snprintf(buf, sizeof(buf), "%.1f", color.a); SetWindowText(GetDlgItem(hWnd, idA), buf);
}
CMinMax<float> Stuff2EditsIntoMinMax(HWND hWnd, UINT idMin, UINT idMax)
{
char buf[256];
float fMin, fMax;
GetWindowText(GetDlgItem(hWnd, idMin), buf, sizeof(buf)); fMin = atof(buf);
GetWindowText(GetDlgItem(hWnd, idMax), buf, sizeof(buf)); fMax = atof(buf);
return(CMinMax<float>(fMin,fMax));
}
void StuffMinMaxInto2Edits(CMinMax<float> minmax, HWND hWnd, UINT idMin, UINT idMax)
{
char buf[256];
_snprintf(buf, sizeof(buf), "%.1f", minmax.m_Min); SetWindowText(GetDlgItem(hWnd, idMin), buf);
_snprintf(buf, sizeof(buf), "%.1f", minmax.m_Max); SetWindowText(GetDlgItem(hWnd, idMax), buf);
}
void BrowseForColor(HWND hWnd, UINT idR, UINT idG, UINT idB, UINT idA)
{
static COLORREF custcolors[16];
CHOOSECOLOR cc;
memset(&cc, 0, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hWnd;
cc.Flags = CC_RGBINIT | CC_FULLOPEN;
cc.lpCustColors = custcolors;
// get current values, convert to 0-255 range
D3DXCOLOR color = Stuff4EditsIntoColor(hWnd, idR, idG, idB, idA);
cc.rgbResult = D3DXColorTo255RGB(color);
if (ChooseColor(&cc)) {
color.r = (float)GetRValue(cc.rgbResult) / 255.0f;
color.g = (float)GetGValue(cc.rgbResult) / 255.0f;
color.b = (float)GetBValue(cc.rgbResult) / 255.0f;
StuffColorInto4Edits(color, hWnd, idR, idG, idB, idA);
}
}
LRESULT CALLBACK PropDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
CMyD3DApplication *app = (CMyD3DApplication *)g_pD3DApp;
static bool bTurnOffUpdates = false;
switch (uMsg) {
case WM_INITDIALOG:
{
bTurnOffUpdates = true; // so as we call ourselves we don't change things
// put current properties into window
StuffVectorInto3Edits(g_theSystem->GetSpawnDir1(), hWnd, IDC_SPAWNDIR1X, IDC_SPAWNDIR1Y, IDC_SPAWNDIR1Z);
StuffVectorInto3Edits(g_theSystem->GetSpawnDir2(), hWnd, IDC_SPAWNDIR2X, IDC_SPAWNDIR2Y, IDC_SPAWNDIR2Z);
StuffVectorInto3Edits(g_theSystem->GetGravity(), hWnd, IDC_GRAVITYX, IDC_GRAVITYY, IDC_GRAVITYZ);
StuffVectorInto3Edits(g_theSystem->GetEmitRadius(),hWnd, IDC_EMITRADIUSX,IDC_EMITRADIUSY,IDC_EMITRADIUSZ);
StuffVectorInto3Edits(g_theSystem->GetPos(), hWnd, IDC_POSX, IDC_POSY, IDC_POSZ);
char buf[256];
_snprintf(buf, sizeof(buf), "%d", g_theSystem->GetMaxParticles()); SetWindowText(GetDlgItem(hWnd, IDC_MAXPARTS), buf);
StuffColorInto4Edits(g_theSystem->GetStartColor1(),hWnd, IDC_STARTCOLOR1R, IDC_STARTCOLOR1G, IDC_STARTCOLOR1B, IDC_STARTCOLOR1A);
StuffColorInto4Edits(g_theSystem->GetStartColor2(),hWnd, IDC_STARTCOLOR2R, IDC_STARTCOLOR2G, IDC_STARTCOLOR2B, IDC_STARTCOLOR2A);
StuffColorInto4Edits(g_theSystem->GetEndColor1(), hWnd, IDC_ENDCOLOR1R, IDC_ENDCOLOR1G, IDC_ENDCOLOR1B, IDC_ENDCOLOR1A);
StuffColorInto4Edits(g_theSystem->GetEndColor2(), hWnd, IDC_ENDCOLOR2R, IDC_ENDCOLOR2G, IDC_ENDCOLOR2B, IDC_ENDCOLOR2A);
StuffMinMaxInto2Edits(g_theSystem->GetLifetime(), hWnd, IDC_LIFETIMEMIN, IDC_LIFETIMEMAX);
StuffMinMaxInto2Edits(g_theSystem->GetSize(), hWnd, IDC_SIZEMIN, IDC_SIZEMAX);
StuffMinMaxInto2Edits(g_theSystem->GetEmitRate(), hWnd, IDC_EMITRATEMIN, IDC_EMITRATEMAX);
SendMessage(GetDlgItem(hWnd, IDC_SHOWGROUND), BM_SETCHECK, app->m_bShowGround, 0);
SetWindowText(GetDlgItem(hWnd, IDC_TEXTURE), g_theSystem->GetTextureFilename().c_str());
PopulateAlphaBlendingComboBox(hWnd, IDC_SRCBLEND);
PopulateAlphaBlendingComboBox(hWnd, IDC_DESTBLEND);
SelectBlendModeInComboBox(hWnd, IDC_SRCBLEND, g_theSystem->GetSrcBlendMode());
SelectBlendModeInComboBox(hWnd, IDC_DESTBLEND, g_theSystem->GetDestBlendMode());
bTurnOffUpdates = false; // now allow updates to go to part sys
return(true); // focus not set
}
case WM_COMMAND:
{
if (bTurnOffUpdates) return(false);
UINT wID = LOWORD(wParam); // item, control, or accelerator identifier
HWND hwndCtl = (HWND) lParam; // handle of control
switch(wID) {
case IDC_SPAWNDIR1X: case IDC_SPAWNDIR1Y: case IDC_SPAWNDIR1Z:
g_theSystem->SetSpawnDir1(Stuff3EditsIntoVector(hWnd, IDC_SPAWNDIR1X, IDC_SPAWNDIR1Y, IDC_SPAWNDIR1Z));
break;
case IDC_SPAWNDIR2X: case IDC_SPAWNDIR2Y: case IDC_SPAWNDIR2Z:
g_theSystem->SetSpawnDir2(Stuff3EditsIntoVector(hWnd, IDC_SPAWNDIR2X, IDC_SPAWNDIR2Y, IDC_SPAWNDIR2Z));
break;
case IDC_GRAVITYX: case IDC_GRAVITYY: case IDC_GRAVITYZ:
g_theSystem->SetGravity(Stuff3EditsIntoVector(hWnd, IDC_GRAVITYX, IDC_GRAVITYY, IDC_GRAVITYZ));
break;
case IDC_EMITRADIUSX: case IDC_EMITRADIUSY: case IDC_EMITRADIUSZ:
g_theSystem->SetEmitRadius(Stuff3EditsIntoVector(hWnd, IDC_EMITRADIUSX, IDC_EMITRADIUSY, IDC_EMITRADIUSZ));
break;
case IDC_POSX: case IDC_POSY: case IDC_POSZ:
g_theSystem->SetPos(Stuff3EditsIntoVector(hWnd, IDC_POSX, IDC_POSY, IDC_POSZ));
break;
case IDC_SRCBLEND:
g_theSystem->SetSrcBlendMode(GetCurSelDataFromComboBox(hWnd, IDC_SRCBLEND));
break;
case IDC_DESTBLEND:
g_theSystem->SetDestBlendMode(GetCurSelDataFromComboBox(hWnd, IDC_DESTBLEND));
break;
case IDC_MAXPARTS:
{
char buf[256];
GetWindowText(GetDlgItem(hWnd, IDC_MAXPARTS), buf, sizeof(buf));
g_theSystem->SetMaxParticles(atoi(buf));
}
break;
case IDC_STARTCOLOR1R: case IDC_STARTCOLOR1G: case IDC_STARTCOLOR1B: case IDC_STARTCOLOR1A:
g_theSystem->SetStartColor1(Stuff4EditsIntoColor(hWnd, IDC_STARTCOLOR1R, IDC_STARTCOLOR1G, IDC_STARTCOLOR1B, IDC_STARTCOLOR1A));
break;
case IDC_STARTCOLOR2R: case IDC_STARTCOLOR2G: case IDC_STARTCOLOR2B: case IDC_STARTCOLOR2A:
g_theSystem->SetStartColor2(Stuff4EditsIntoColor(hWnd, IDC_STARTCOLOR2R, IDC_STARTCOLOR2G, IDC_STARTCOLOR2B, IDC_STARTCOLOR2A));
break;
case IDC_ENDCOLOR1R: case IDC_ENDCOLOR1G: case IDC_ENDCOLOR1B: case IDC_ENDCOLOR1A:
g_theSystem->SetEndColor1(Stuff4EditsIntoColor(hWnd, IDC_ENDCOLOR1R, IDC_ENDCOLOR1G, IDC_ENDCOLOR1B, IDC_ENDCOLOR1A));
break;
case IDC_ENDCOLOR2R: case IDC_ENDCOLOR2G: case IDC_ENDCOLOR2B: case IDC_ENDCOLOR2A:
g_theSystem->SetEndColor2(Stuff4EditsIntoColor(hWnd, IDC_ENDCOLOR2R, IDC_ENDCOLOR2G, IDC_ENDCOLOR2B, IDC_ENDCOLOR2A));
break;
case IDC_STARTCOLOR1BROWSE:
BrowseForColor(hWnd, IDC_STARTCOLOR1R, IDC_STARTCOLOR1G, IDC_STARTCOLOR1B, IDC_STARTCOLOR1A);
break;
case IDC_STARTCOLOR2BROWSE:
BrowseForColor(hWnd, IDC_STARTCOLOR2R, IDC_STARTCOLOR2G, IDC_STARTCOLOR2B, IDC_STARTCOLOR2A);
break;
case IDC_ENDCOLOR1BROWSE:
BrowseForColor(hWnd, IDC_ENDCOLOR1R, IDC_ENDCOLOR1G, IDC_ENDCOLOR1B, IDC_ENDCOLOR1A);
break;
case IDC_ENDCOLOR2BROWSE:
BrowseForColor(hWnd, IDC_ENDCOLOR2R, IDC_ENDCOLOR2G, IDC_ENDCOLOR2B, IDC_ENDCOLOR2A);
break;
case IDC_LIFETIMEMIN: case IDC_LIFETIMEMAX:
g_theSystem->SetLifetime(Stuff2EditsIntoMinMax(hWnd, IDC_LIFETIMEMIN, IDC_LIFETIMEMAX));
break;
case IDC_SIZEMIN: case IDC_SIZEMAX:
g_theSystem->SetSize(Stuff2EditsIntoMinMax(hWnd, IDC_SIZEMIN, IDC_SIZEMAX));
break;
case IDC_EMITRATEMIN: case IDC_EMITRATEMAX:
g_theSystem->SetEmitRate(Stuff2EditsIntoMinMax(hWnd, IDC_EMITRATEMIN, IDC_EMITRATEMAX));
break;
case IDC_RESET:
g_theSystem->Reset();
break;
case IDC_SHOWGROUND:
app->m_bShowGround = app->m_bShowGround ? false : true;
break;
case IDC_TEXTURE_BROWSE:
{
OPENFILENAME ofn; // common dialog box structure
char szFile[260]; // buffer for filename
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
strncpy(szFile, g_theSystem->GetTextureFilename().c_str(), sizeof(szFile));
ofn.lpstrFile = szFile;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "PNG Files (*.png)\0*.png\0Bitmap Files (*.bmp)\0*.bmp\0All Files (*.*)\0*.*\0\0";
ofn.lpstrFileTitle = "Choose Texture File";
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE) {
g_theSystem->SetTexture(ofn.lpstrFile);
SetWindowText(GetDlgItem(hWnd, IDC_TEXTURE), g_theSystem->GetTextureFilename().c_str());
}
}
break;
case IDC_SAVE:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -