⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch18p2_particleprops.cpp

📁 游戏开发特殊技巧-special.effects.game.programming
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
#############################################################################

  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 + -