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>
This commit is contained in:
282
GameTools/Effect/X3DEffectCylinder.cpp
Normal file
282
GameTools/Effect/X3DEffectCylinder.cpp
Normal file
@@ -0,0 +1,282 @@
|
||||
// X3DEffectCylinder.cpp: implementation of the CX3DEffectCylinder class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "X3DEffect.h"
|
||||
#include "X3DEffectCylinder.h"
|
||||
#include "SceneStateMgr.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CX3DEffectCylinder::CX3DEffectCylinder()
|
||||
{
|
||||
m_dwSrcBlending = D3DBLEND_SRCALPHA;
|
||||
m_dwDestBlending = D3DBLEND_ONE;
|
||||
|
||||
m_bTexAni = FALSE;
|
||||
|
||||
m_lpVertices = NULL;
|
||||
m_lpVerticesBlend = NULL;
|
||||
}
|
||||
|
||||
CX3DEffectCylinder::~CX3DEffectCylinder()
|
||||
{
|
||||
if(m_lpVerticesBlend) { m_lpVerticesBlend->Release(); m_lpVerticesBlend = NULL; }
|
||||
if(m_lpVertices) { m_lpVertices->Release(); m_lpVertices = NULL; }
|
||||
}
|
||||
|
||||
void CX3DEffectCylinder::Create(unsigned long dwStartFrame, unsigned long dwEndFrame)
|
||||
{
|
||||
m_dwStartFrame = dwStartFrame;
|
||||
m_dwEndFrame = dwEndFrame;
|
||||
}
|
||||
|
||||
BOOL CX3DEffectCylinder::CreateBuffer(void)
|
||||
{
|
||||
if(m_lpVerticesBlend) { m_lpVerticesBlend->Release(); m_lpVerticesBlend = NULL; }
|
||||
if(m_lpVertices) { m_lpVertices->Release(); m_lpVertices = NULL; }
|
||||
|
||||
m_lpD3DDevice->CreateVertexBuffer( ((m_dwSidePlane + 1) * 2) * sizeof(LVertex), D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, LVERTEXFVF,
|
||||
D3DPOOL_DEFAULT, &m_lpVertices );
|
||||
m_lpD3DDevice->CreateVertexBuffer( ((m_dwSidePlane + 1) * 2) * sizeof(LVertex), D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, LVERTEXFVF,
|
||||
D3DPOOL_DEFAULT, &m_lpVerticesBlend );
|
||||
|
||||
m_dwPrimitive = m_dwSidePlane * 2;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CX3DEffectCylinder::Render(void)
|
||||
{
|
||||
if(!m_bVisibility)
|
||||
return;
|
||||
if(m_lpVertices == NULL) return;
|
||||
|
||||
matrix matWorld;
|
||||
matWorld.MakeIdent();
|
||||
quaternion *quatAxis = ((CX3DEffect *)m_lpLocalEffect)->GetAxis();
|
||||
|
||||
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
|
||||
|
||||
if(quatAxis) { z3d::MatrixRotationQuaternion(matWorld, (*quatAxis)); }
|
||||
if(m_QuatSet) {
|
||||
z3d::MatrixRotationQuaternion(matWorld, (m_TmpQuat));
|
||||
}
|
||||
if(((CX3DEffect *)m_lpLocalEffect)->GetCenter())
|
||||
{
|
||||
vector3 *vecTemp = ((CX3DEffect *)m_lpLocalEffect)->GetCenter();
|
||||
matWorld._41 = vecTemp->x;
|
||||
matWorld._42 = vecTemp->y;
|
||||
matWorld._43 = vecTemp->z;
|
||||
}
|
||||
m_lpD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX *)&matWorld);
|
||||
|
||||
m_lpD3DDevice->SetTexture(0, GetTexture());
|
||||
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, m_dwSrcBlending);
|
||||
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, m_dwDestBlending);
|
||||
m_lpD3DDevice->SetStreamSource(0, m_lpVertices, sizeof(LVertex));
|
||||
m_lpD3DDevice->SetVertexShader(LVERTEXFVF);
|
||||
m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, m_dwPrimitive);
|
||||
|
||||
if(m_bTexAni)
|
||||
{
|
||||
CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
||||
CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
|
||||
m_lpD3DDevice->SetStreamSource(0, m_lpVerticesBlend, sizeof(LVertex));
|
||||
m_lpD3DDevice->SetVertexShader(LVERTEXFVF);
|
||||
m_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, m_dwPrimitive);
|
||||
}/**/
|
||||
}
|
||||
|
||||
BOOL CX3DEffectCylinder::Interpolation(float fFrame)
|
||||
{
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
if(!m_lstCenter.Interpolation(fFrame, m_vecCenter)) return FALSE;
|
||||
if(!m_lstAxis.InterpolationQ(fFrame, m_quatAxis)) return FALSE;
|
||||
|
||||
if(!m_lstUpperHeight.Interpolation(fFrame, m_fUpperHeight)) return FALSE;
|
||||
if(!m_lstUpperRadius.Interpolation(fFrame, m_fUpperRadius)) return FALSE;
|
||||
if(!m_lstLowerHeight.Interpolation(fFrame, m_fLowerHeight)) return FALSE;
|
||||
if(!m_lstLowerRadius.Interpolation(fFrame, m_fLowerRadius)) return FALSE;
|
||||
if(m_Scale[0] != 1.0f) {
|
||||
m_fUpperHeight *=m_Scale[0];
|
||||
m_fUpperRadius *=m_Scale[0];
|
||||
m_fLowerHeight *=m_Scale[0];
|
||||
m_fLowerRadius *=m_Scale[0];
|
||||
m_vecCenter.x *=m_Scale[0];
|
||||
m_vecCenter.z *=m_Scale[0];
|
||||
m_vecCenter.y *=(m_Scale[0]);
|
||||
}
|
||||
if(!m_lstColor.InterpolationC(fFrame, m_lColor)) return FALSE;
|
||||
if(m_bTexAni)
|
||||
{
|
||||
if(!m_lstTexFrame.Interpolation(fFrame, m_fTexFrame)) return FALSE;
|
||||
} else
|
||||
{
|
||||
if(!m_lstStartU.Interpolation(fFrame, m_fStartU)) return FALSE;
|
||||
if(!m_lstStartV.Interpolation(fFrame, m_fStartV)) return FALSE;
|
||||
if(!m_lstTileU.Interpolation(fFrame, m_fTileU)) return FALSE;
|
||||
if(!m_lstTileV.Interpolation(fFrame, m_fTileV)) return FALSE;
|
||||
}
|
||||
if(m_bVisibility) {
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
LVertex *pVertices, *pVerticesBlend;
|
||||
if(FAILED( m_lpVertices->Lock( 0, ((m_dwSidePlane + 1) * 2) * sizeof(LVertex), (unsigned char **)&pVertices, D3DLOCK_DISCARD ) ) )
|
||||
return FALSE;
|
||||
if(FAILED( m_lpVerticesBlend->Lock( 0, ((m_dwSidePlane + 1) * 2) * sizeof(LVertex), (unsigned char **)&pVerticesBlend, D3DLOCK_DISCARD ) ) )
|
||||
return FALSE;
|
||||
|
||||
unsigned long i, tempi;
|
||||
float degree;
|
||||
float divangle = 360.0f / m_dwSidePlane;
|
||||
float f1, f2;
|
||||
float fStartU, fStartV, fEndU, fEndV;
|
||||
float fStartBU, fStartBV, fEndBU, fEndBV;
|
||||
if(m_bTexAni)
|
||||
{
|
||||
|
||||
|
||||
f1 = (((long)m_fTexFrame) % 4) * 0.25;
|
||||
f2 = (((long)m_fTexFrame) / 4) * 0.25;
|
||||
fStartU = f1;
|
||||
fStartV = f2;
|
||||
|
||||
f1 = (((long)ceilf(m_fTexFrame)) % 4) * 0.25;
|
||||
f2 = (((long)ceilf(m_fTexFrame)) / 4) * 0.25;
|
||||
fStartBU = f1;
|
||||
fStartBV = f2;
|
||||
|
||||
fEndU = fEndBU = 0.25f;
|
||||
fEndV = fEndBV = 0.25f;
|
||||
} else
|
||||
{
|
||||
fStartBU = fStartU = m_fStartU;
|
||||
fStartBV = fStartV = m_fStartV;
|
||||
fEndBU = fEndU = m_fTileU - fStartBU;
|
||||
fEndBV = fEndV = m_fTileV - fStartBV;
|
||||
}
|
||||
|
||||
for(i = 0; i < m_dwSidePlane; i++)
|
||||
{
|
||||
degree = FLOAT_DEG(i * divangle);
|
||||
|
||||
tempi = i * 2 + 1;
|
||||
pVertices[tempi].v = vector3(m_fUpperRadius * cosf(degree), m_fUpperHeight, m_fUpperRadius * sinf(degree));
|
||||
z3d::VectorRotate(pVertices[tempi].v, pVertices[tempi].v, m_quatAxis);
|
||||
pVertices[tempi].v += m_vecCenter;
|
||||
pVerticesBlend[tempi].v = pVertices[tempi].v;
|
||||
|
||||
pVertices[tempi].tu = fStartU + fEndU * (float)i / m_dwSidePlane;
|
||||
pVertices[tempi].tv = fStartV;
|
||||
pVerticesBlend[tempi].tu = fStartBU + fEndBU * (float)i / m_dwSidePlane;
|
||||
pVerticesBlend[tempi].tv = fStartBV;
|
||||
|
||||
tempi = i * 2;
|
||||
pVertices[tempi].v = vector3(m_fLowerRadius * cosf(degree), -m_fLowerHeight, m_fLowerRadius * sinf(degree));
|
||||
z3d::VectorRotate(pVertices[tempi].v, pVertices[tempi].v, m_quatAxis);
|
||||
pVertices[tempi].v += m_vecCenter;
|
||||
pVerticesBlend[tempi].v = pVertices[tempi].v;
|
||||
|
||||
pVertices[tempi].tu = fStartU + fEndU * (float)i / m_dwSidePlane;
|
||||
pVertices[tempi].tv = fEndV;
|
||||
pVerticesBlend[tempi].tu = fStartBU + fEndBU * (float)i / m_dwSidePlane;
|
||||
pVerticesBlend[tempi].tv = fEndBV;
|
||||
}
|
||||
tempi = m_dwSidePlane * 2 + 1;
|
||||
pVertices[tempi].v = pVertices[1].v;
|
||||
pVertices[tempi].tu = fStartU + fEndU;
|
||||
pVertices[tempi].tv = fStartV;
|
||||
pVerticesBlend[tempi].tu = fStartBU + fEndBU;
|
||||
pVerticesBlend[tempi].tv = fStartBV;
|
||||
|
||||
tempi = m_dwSidePlane * 2;
|
||||
pVertices[tempi].v = pVertices[0].v;
|
||||
pVertices[tempi].tu = fStartU + fEndU;
|
||||
pVertices[tempi].tv = fEndV;
|
||||
pVerticesBlend[tempi].tu = fStartBU + fEndBU;
|
||||
pVerticesBlend[tempi].tv = fEndBV;
|
||||
|
||||
pVertices[0].diff = m_lColor;
|
||||
pVertices[0].spec = color(0xFF, 0xFF, 0xFF, 0xFF);
|
||||
pVerticesBlend[0].diff = pVertices[0].diff;
|
||||
pVerticesBlend[0].spec = pVertices[0].spec;
|
||||
if(m_bTexAni)
|
||||
{
|
||||
pVertices[0].diff.a *= (floorf(m_fTexFrame + 1.0f) - m_fTexFrame);
|
||||
pVerticesBlend[0].diff.a *= (m_fTexFrame - floorf(m_fTexFrame));
|
||||
}
|
||||
|
||||
for(i = 1; i < (m_dwSidePlane + 1) * 2; i++)
|
||||
{
|
||||
pVertices[i].diff = pVertices[0].diff;
|
||||
pVertices[i].spec = pVertices[0].spec;
|
||||
pVerticesBlend[i].diff = pVerticesBlend[0].diff;
|
||||
pVerticesBlend[i].spec = pVerticesBlend[0].spec;
|
||||
}
|
||||
m_lpVerticesBlend->Unlock();
|
||||
m_lpVertices->Unlock();
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CX3DEffectCylinder::Load(FILE *fp, const char *strOriginalPath)
|
||||
{
|
||||
fread(&m_bTexAni, 4, 1, fp);
|
||||
fread(&m_dwSrcBlending, 4, 1, fp);
|
||||
fread(&m_dwDestBlending, 4, 1, fp);
|
||||
|
||||
m_lstAxis.Load(fp, m_quatAxis);
|
||||
m_lstCenter.Load(fp, m_vecCenter);
|
||||
fread(&m_dwSidePlane, 4, 1, fp);
|
||||
|
||||
m_lstColor.Load(fp, m_lColor);
|
||||
m_lstUpperHeight.Load(fp, m_fUpperHeight);
|
||||
m_lstUpperRadius.Load(fp, m_fUpperRadius);
|
||||
m_lstLowerHeight.Load(fp, m_fLowerHeight);
|
||||
m_lstLowerRadius.Load(fp, m_fLowerRadius);
|
||||
if(m_Scale[0] != 1.0f) {
|
||||
m_fUpperHeight *=m_Scale[0];
|
||||
m_fUpperRadius *=m_Scale[0];
|
||||
m_fLowerHeight *=m_Scale[0];
|
||||
m_fLowerRadius *=m_Scale[0];
|
||||
|
||||
m_vecCenter.x *=m_Scale[0];
|
||||
m_vecCenter.z *=m_Scale[0];
|
||||
m_vecCenter.y *=(m_Scale[0]);
|
||||
}
|
||||
|
||||
m_lstStartU.Load(fp, m_fStartU);
|
||||
m_lstStartV.Load(fp, m_fStartV);
|
||||
m_lstTileU.Load(fp, m_fTileU);
|
||||
m_lstTileV.Load(fp, m_fTileV);
|
||||
m_lstTexFrame.Load(fp, m_fTexFrame);
|
||||
}
|
||||
|
||||
void CX3DEffectCylinder::Save(FILE *fp, const char *strOriginalPath)
|
||||
{
|
||||
fwrite(&m_bTexAni, 4, 1, fp);
|
||||
fwrite(&m_dwSrcBlending, 4, 1, fp);
|
||||
fwrite(&m_dwDestBlending, 4, 1, fp);
|
||||
|
||||
m_lstAxis.Save(fp);
|
||||
m_lstCenter.Save(fp);
|
||||
fwrite(&m_dwSidePlane, 4, 1, fp);
|
||||
|
||||
m_lstColor.Save(fp);
|
||||
m_lstUpperHeight.Save(fp);
|
||||
m_lstUpperRadius.Save(fp);
|
||||
m_lstLowerHeight.Save(fp);
|
||||
m_lstLowerRadius.Save(fp);
|
||||
|
||||
m_lstStartU.Save(fp);
|
||||
m_lstStartV.Save(fp);
|
||||
m_lstTileU.Save(fp);
|
||||
m_lstTileV.Save(fp);
|
||||
m_lstTexFrame.Save(fp);
|
||||
}
|
||||
Reference in New Issue
Block a user