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>
281 lines
11 KiB
C++
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;
|
|
}
|