Files
Client/GameTools/EffectEditor/X3DEffectEditParticle.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

281 lines
11 KiB
C++

// X3DEffectEditParticle.cpp: implementation of the CX3DEffectEditParticle class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "effectEditor.h"
#include "X3DEffectEditParticle.h"
#include "X3DEditEffect.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CX3DEffectEditParticle::CX3DEffectEditParticle()
{
unsigned long i;
m_verEmitter[0].diff = color(rand() % 256, rand() % 256, rand() % 256);
m_verEmitter[0].diff.a = 120;
m_verEmitter[0].spec = color(0xFF, 0xFF, 0xFF, 0xFF);
m_verEmitter[0].tu = m_verEmitter[0].tv = 0.0f;
for(i = 1; i < 8; i++)
{
m_verEmitter[i].diff = m_verEmitter[0].diff;
m_verEmitter[i].spec = m_verEmitter[0].spec;
m_verEmitter[i].tu = m_verEmitter[i].tv = 0.0f;
}
m_dwEmitterIndex[ 0] = 0; m_dwEmitterIndex[ 1] = 1; m_dwEmitterIndex[ 2] = 2;
m_dwEmitterIndex[ 3] = 1; m_dwEmitterIndex[ 4] = 3; m_dwEmitterIndex[ 5] = 2;
m_dwEmitterIndex[ 6] = 3; m_dwEmitterIndex[ 7] = 1; m_dwEmitterIndex[ 8] = 7;
m_dwEmitterIndex[ 9] = 1; m_dwEmitterIndex[10] = 5; m_dwEmitterIndex[11] = 7;
m_dwEmitterIndex[12] = 5; m_dwEmitterIndex[13] = 4; m_dwEmitterIndex[14] = 7;
m_dwEmitterIndex[15] = 4; m_dwEmitterIndex[16] = 6; m_dwEmitterIndex[17] = 7;
m_dwEmitterIndex[18] = 0; m_dwEmitterIndex[19] = 2; m_dwEmitterIndex[20] = 4;
m_dwEmitterIndex[21] = 4; m_dwEmitterIndex[22] = 2; m_dwEmitterIndex[23] = 6;
m_dwEmitterIndex[24] = 2; m_dwEmitterIndex[25] = 3; m_dwEmitterIndex[26] = 7;
m_dwEmitterIndex[27] = 2; m_dwEmitterIndex[28] = 7; m_dwEmitterIndex[29] = 6;
m_dwEmitterIndex[30] = 0; m_dwEmitterIndex[31] = 4; m_dwEmitterIndex[32] = 5;
m_dwEmitterIndex[33] = 0; m_dwEmitterIndex[34] = 5; m_dwEmitterIndex[35] = 1;
m_verVolume[0].diff = color(0xFF, 0xFF, 0xFF);
m_verVolume[0].spec = color(0xFF, 0xFF, 0xFF, 0xFF);
m_verVolume[0].tu = m_verVolume[0].tv = 0.0f;
for(i = 1; i < 32; i++)
{
m_verVolume[i].diff = m_verVolume[0].diff;
m_verVolume[i].spec = m_verVolume[0].spec;
m_verVolume[i].tu = m_verVolume[i].tv = 0.0f;
}
m_dwVolumeIndex[ 0] = 0; m_dwVolumeIndex[ 1] = 1;
m_dwVolumeIndex[ 2] = 1; m_dwVolumeIndex[ 3] = 2;
m_dwVolumeIndex[ 4] = 2; m_dwVolumeIndex[ 5] = 3;
m_dwVolumeIndex[ 6] = 3; m_dwVolumeIndex[ 7] = 4;
m_dwVolumeIndex[ 8] = 4; m_dwVolumeIndex[ 9] = 5;
m_dwVolumeIndex[10] = 5; m_dwVolumeIndex[11] = 6;
m_dwVolumeIndex[12] = 6; m_dwVolumeIndex[13] = 7;
m_dwVolumeIndex[14] = 7; m_dwVolumeIndex[15] = 8;
m_dwVolumeIndex[16] = 8; m_dwVolumeIndex[17] = 9;
m_dwVolumeIndex[18] = 9; m_dwVolumeIndex[19] = 10;
m_dwVolumeIndex[20] = 10; m_dwVolumeIndex[21] = 11;
m_dwVolumeIndex[22] = 11; m_dwVolumeIndex[23] = 12;
m_dwVolumeIndex[24] = 12; m_dwVolumeIndex[25] = 13;
m_dwVolumeIndex[26] = 13; m_dwVolumeIndex[27] = 14;
m_dwVolumeIndex[28] = 14; m_dwVolumeIndex[29] = 15;
m_dwVolumeIndex[30] = 15; m_dwVolumeIndex[31] = 0;
m_dwVolumeIndex[32] = 16; m_dwVolumeIndex[33] = 17;
m_dwVolumeIndex[34] = 17; m_dwVolumeIndex[35] = 18;
m_dwVolumeIndex[36] = 18; m_dwVolumeIndex[37] = 19;
m_dwVolumeIndex[38] = 19; m_dwVolumeIndex[39] = 20;
m_dwVolumeIndex[40] = 20; m_dwVolumeIndex[41] = 21;
m_dwVolumeIndex[42] = 21; m_dwVolumeIndex[43] = 22;
m_dwVolumeIndex[44] = 22; m_dwVolumeIndex[45] = 23;
m_dwVolumeIndex[46] = 23; m_dwVolumeIndex[47] = 24;
m_dwVolumeIndex[48] = 24; m_dwVolumeIndex[49] = 25;
m_dwVolumeIndex[50] = 25; m_dwVolumeIndex[51] = 26;
m_dwVolumeIndex[52] = 26; m_dwVolumeIndex[53] = 27;
m_dwVolumeIndex[54] = 27; m_dwVolumeIndex[55] = 28;
m_dwVolumeIndex[56] = 28; m_dwVolumeIndex[57] = 29;
m_dwVolumeIndex[58] = 29; m_dwVolumeIndex[59] = 30;
m_dwVolumeIndex[60] = 30; m_dwVolumeIndex[61] = 31;
m_dwVolumeIndex[62] = 31; m_dwVolumeIndex[63] = 16;
}
CX3DEffectEditParticle::~CX3DEffectEditParticle()
{
}
void CX3DEffectEditParticle::RenderNoTexture(unsigned long dwFrame)
{
m_lpD3DDevice->SetTexture(0, NULL);
m_lpD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 24, 12,
m_dwEmitterIndex, D3DFMT_INDEX16, m_verEmitter, sizeof(LVertex));
}
unsigned long CX3DEffectEditParticle::GetPick(vector3 &vecStart, vector3 &vecEnd, float &fLength)
{
vector3 vecVertices[3];
for(unsigned long i = 0; i < 12; i++)
{
vecVertices[0] = m_verEmitter[m_dwEmitterIndex[i * 3 + 0]].v;
vecVertices[1] = m_verEmitter[m_dwEmitterIndex[i * 3 + 1]].v;
vecVertices[2] = m_verEmitter[m_dwEmitterIndex[i * 3 + 2]].v;
if(CIntersection::PolygonRay(vecStart, vecEnd, vecVertices, fLength)) return m_dwEffectKind;
}
fLength = 0.0f;
return 0xFFFFFFFF;
}
void CX3DEffectEditParticle::Render(void)
{
if(m_lpVertices == NULL) return;
if(((CX3DEditEffect *)m_lpLocalEffect)->GetPlay())
{
CX3DEffectParticle::Render();
return;
}
m_verEmitter[0].v = vector3(-5.0f, 5.0f, 5.0f);
m_verEmitter[1].v = vector3( 5.0f, 5.0f, 5.0f);
m_verEmitter[2].v = vector3(-5.0f, 5.0f, -5.0f);
m_verEmitter[3].v = vector3( 5.0f, 5.0f, -5.0f);
m_verEmitter[4].v = vector3(-5.0f, -5.0f, 5.0f);
m_verEmitter[5].v = vector3( 5.0f, -5.0f, 5.0f);
m_verEmitter[6].v = vector3(-5.0f, -5.0f, -5.0f);
m_verEmitter[7].v = vector3( 5.0f, -5.0f, -5.0f);
z3d::VectorRotate(m_verEmitter[0].v, m_verEmitter[0].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[1].v, m_verEmitter[1].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[2].v, m_verEmitter[2].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[3].v, m_verEmitter[3].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[4].v, m_verEmitter[4].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[5].v, m_verEmitter[5].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[6].v, m_verEmitter[6].v, m_quatAxis);
z3d::VectorRotate(m_verEmitter[7].v, m_verEmitter[7].v, m_quatAxis);
m_verEmitter[0].v += m_vecCenter;
m_verEmitter[1].v += m_vecCenter;
m_verEmitter[2].v += m_vecCenter;
m_verEmitter[3].v += m_vecCenter;
m_verEmitter[4].v += m_vecCenter;
m_verEmitter[5].v += m_vecCenter;
m_verEmitter[6].v += m_vecCenter;
m_verEmitter[7].v += m_vecCenter;
m_verEmitter[0].diff.a = 255; m_verEmitter[1].diff.a = 255;
m_verEmitter[2].diff.a = 255; m_verEmitter[3].diff.a = 255;
m_verEmitter[4].diff.a = 255; m_verEmitter[5].diff.a = 255;
m_verEmitter[6].diff.a = 255; m_verEmitter[7].diff.a = 255;
m_verEmitter[7].diff.a *= m_fAlpha;
m_verEmitter[0].diff.a = m_verEmitter[1].diff.a = m_verEmitter[2].diff.a = m_verEmitter[3].diff.a =
m_verEmitter[4].diff.a = m_verEmitter[5].diff.a = m_verEmitter[6].diff.a = m_verEmitter[7].diff.a;
m_lpD3DDevice->SetTexture(0, NULL);
m_lpD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 24, 12,
m_dwEmitterIndex, D3DFMT_INDEX16, m_verEmitter, sizeof(LVertex));
switch(m_dwVolumeType)
{
case 1:
m_verVolume[ 0].v = m_verVolume[ 4].v = vector3(-m_fVolX / 2, m_fVolY / 2, m_fVolZ / 2);
m_verVolume[ 3].v = m_verVolume[ 7].v = vector3( m_fVolX / 2, m_fVolY / 2, m_fVolZ / 2);
m_verVolume[ 1].v = m_verVolume[13].v = vector3(-m_fVolX / 2, m_fVolY / 2, -m_fVolZ / 2);
m_verVolume[ 2].v = m_verVolume[14].v = vector3( m_fVolX / 2, m_fVolY / 2, -m_fVolZ / 2);
m_verVolume[ 5].v = m_verVolume[11].v = vector3(-m_fVolX / 2, -m_fVolY / 2, m_fVolZ / 2);
m_verVolume[ 6].v = m_verVolume[ 8].v = vector3( m_fVolX / 2, -m_fVolY / 2, m_fVolZ / 2);
m_verVolume[10].v = m_verVolume[12].v = vector3(-m_fVolX / 2, -m_fVolY / 2, -m_fVolZ / 2);
m_verVolume[ 9].v = m_verVolume[15].v = vector3( m_fVolX / 2, -m_fVolY / 2, -m_fVolZ / 2);
z3d::VectorRotate(m_verVolume[ 0].v, m_verVolume[ 0].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 1].v, m_verVolume[ 1].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 2].v, m_verVolume[ 2].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 3].v, m_verVolume[ 3].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 4].v, m_verVolume[ 4].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 5].v, m_verVolume[ 5].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 6].v, m_verVolume[ 6].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 7].v, m_verVolume[ 7].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 8].v, m_verVolume[ 8].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[ 9].v, m_verVolume[ 9].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[10].v, m_verVolume[10].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[11].v, m_verVolume[11].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[12].v, m_verVolume[12].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[13].v, m_verVolume[13].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[14].v, m_verVolume[14].v, m_quatAxis);
z3d::VectorRotate(m_verVolume[15].v, m_verVolume[15].v, m_quatAxis);
m_verVolume[ 0].v += m_vecCenter;
m_verVolume[ 1].v += m_vecCenter;
m_verVolume[ 2].v += m_vecCenter;
m_verVolume[ 3].v += m_vecCenter;
m_verVolume[ 4].v += m_vecCenter;
m_verVolume[ 5].v += m_vecCenter;
m_verVolume[ 6].v += m_vecCenter;
m_verVolume[ 7].v += m_vecCenter;
m_verVolume[ 8].v += m_vecCenter;
m_verVolume[ 9].v += m_vecCenter;
m_verVolume[10].v += m_vecCenter;
m_verVolume[11].v += m_vecCenter;
m_verVolume[12].v += m_vecCenter;
m_verVolume[13].v += m_vecCenter;
m_verVolume[14].v += m_vecCenter;
m_verVolume[15].v += m_vecCenter;
m_lpD3DDevice->SetTexture(0, NULL);
m_lpD3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, 30, 15,
m_dwVolumeIndex, D3DFMT_INDEX16, m_verVolume, sizeof(LVertex));
break;
case 2:
{
unsigned long i;
float degree;
for(i = 0; i < 16; i++)
{
degree = FLOAT_DEG(i * 22.5f);
m_verVolume[i].v = vector3(m_fRadius * cosf(degree), 0, m_fRadius * sinf(degree));
z3d::VectorRotate(m_verVolume[i].v, m_verVolume[i].v, m_quatAxis);
m_verVolume[i].v += m_vecCenter;
m_verVolume[i + 16].v = vector3(m_fInnerRadius * cosf(degree), 0, m_fInnerRadius * sinf(degree));
z3d::VectorRotate(m_verVolume[i + 16].v, m_verVolume[i + 16].v, m_quatAxis);
m_verVolume[i + 16].v += m_vecCenter;
}
m_lpD3DDevice->SetTexture(0, NULL);
m_lpD3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, 64, 32,
m_dwVolumeIndex, D3DFMT_INDEX16, m_verVolume, sizeof(LVertex));
}
break;
}
}
BOOL CX3DEffectEditParticle::Interpolation(float fFrame)
{
if(m_lpVertices == NULL) return FALSE;
///////////////////////////////////////////////////////////////////////////////////
if(((CX3DEditEffect *)m_lpLocalEffect)->GetPlay())
{
if(!CX3DEffectParticle::Interpolation(fFrame)) return FALSE;
return TRUE;
}
m_lstCenter.Interpolation(fFrame, m_vecCenter);
m_lstEForce.Interpolation(fFrame, m_vecEForce);
m_lstAlpha.Interpolation(fFrame, m_fAlpha);
m_lstAxis.InterpolationQ(fFrame, m_quatAxis);
m_lstDirection.InterpolationQ(fFrame, m_quatDir);
m_lstPower.Interpolation(fFrame, m_fPower);
m_lstAngle.Interpolation(fFrame, m_fAngle);
///////////////////////////////////////////////////////////////////////////////////
return TRUE;
}
BOOL CX3DEffectEditParticle::ArrangementTexture(const char *strPathName)
{
if(!strncmp(m_strTextureFile, strPathName, strlen(strPathName)))
{
strcpy(m_strTextureFile, &m_strTextureFile[strlen(strPathName)]);
return TRUE;
} else
return FALSE;
}