// 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; }