port from perforce
This commit is contained in:
973
evoke-64k/bp10/mesher.h
Normal file
973
evoke-64k/bp10/mesher.h
Normal file
@@ -0,0 +1,973 @@
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
0 1
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
x xx ..... xxx x
|
||||
x. xx ..... xx x
|
||||
x . xx ..... xx x
|
||||
x . xx .... xx x
|
||||
x . xx 4 xx x
|
||||
x . xxxxxxxxxxxxxxx 5 x
|
||||
x . x x x . x
|
||||
x . x xx x . x
|
||||
x . x xxx x . x
|
||||
x . x xx x . x
|
||||
x . x x . x
|
||||
x 7 xxxxxxxxxxxxxxx . x
|
||||
x xx 6 xx . x
|
||||
x xx .... xx . x
|
||||
x xx ..... xx . x
|
||||
x xx ..... xx . x
|
||||
x xxx ..... xxx x
|
||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||
3 2
|
||||
*/
|
||||
|
||||
/*
|
||||
struct SVertexMesh
|
||||
{
|
||||
D3DXVECTOR3 Pos;
|
||||
D3DXVECTOR3 Normal;
|
||||
DWORD dwColor;
|
||||
};
|
||||
|
||||
const DWORD c_dwFVFMesh= D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE;
|
||||
|
||||
SVertexMesh PreMesh[ 128 * 128 ];
|
||||
float PreFloats[ 128 * 128 * 16 ];
|
||||
const int PreFloatBlock= 128 * 128;
|
||||
float* PreFloat( int i )
|
||||
{
|
||||
return PreFloats + i * PreFloatBlock;
|
||||
}
|
||||
SVertexMesh FinalMesh[ 128 * 128 * 32 ];
|
||||
|
||||
void CreateFloatFieldPlasma(
|
||||
int ParamBank, float* pFloat,
|
||||
float fStepX, int iStepsX,
|
||||
float fStepY, int iStepsY,
|
||||
float fTime)
|
||||
{
|
||||
const float fAmplifyX= GetFloatParam( ParamBank, 0 );
|
||||
const float fAmplifyY= GetFloatParam( ParamBank, 1 );
|
||||
const float fBaseValue= GetFloatParam( ParamBank, 2 );
|
||||
|
||||
const float fStretchAmplify= GetFloatParam( ParamBank, 3 );
|
||||
|
||||
const float fStretchX= GetFloatParam( ParamBank + 1, 0 );
|
||||
const float fStretchX2= GetFloatParam( ParamBank + 1, 1 );
|
||||
const float fSpeedX= GetFloatParam( ParamBank + 1, 2 );
|
||||
const float fSpeedX2= GetFloatParam( ParamBank + 1, 3 );
|
||||
|
||||
const float fStretchY= GetFloatParam( ParamBank + 2, 0 );
|
||||
const float fStretchY2= GetFloatParam( ParamBank + 2, 1 );
|
||||
const float fSpeedY= GetFloatParam( ParamBank + 2, 2 );
|
||||
const float fSpeedY2= GetFloatParam( ParamBank + 2, 3 );
|
||||
|
||||
const float fStartX= 0.0f;
|
||||
const float fStartY= 0.0f;
|
||||
|
||||
float fY= fStartY;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float fX= fStartX;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
float fVal= fBaseValue +
|
||||
fAmplifyX * sin( fX * fStretchX +
|
||||
fSpeedX * fTime +
|
||||
fStretchAmplify * sin( fStretchX2 * fY + fTime * fSpeedX2 ) ) +
|
||||
fAmplifyY * sin( fY * fStretchY +
|
||||
fSpeedY * fTime +
|
||||
fStretchAmplify * sin( fStretchY2 * fX + fTime * fSpeedY2 ) );
|
||||
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
pFloat[ iOffset ]= fVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateTwistedBow(
|
||||
int ParamBank, float* pFloat,
|
||||
float fStepX, int iStepsX,
|
||||
float fStepY, int iStepsY,
|
||||
float fTime )
|
||||
{
|
||||
const float fStrength= GetFloatParam( ParamBank, 0 );
|
||||
const float fAmpliHorz= GetFloatParam( ParamBank, 1 );
|
||||
const float fRepHorz= GetFloatParam( ParamBank, 2 );
|
||||
const float fSpeedHorz= GetFloatParam( ParamBank, 3 );
|
||||
|
||||
const float fTwistVert= GetFloatParam( ParamBank + 1, 0 );
|
||||
const float fAmpliVert= GetFloatParam( ParamBank + 1, 1 );
|
||||
const float fRepVert= GetFloatParam( ParamBank + 1, 2 );
|
||||
const float fSpeedVert= GetFloatParam( ParamBank + 1, 3 );
|
||||
|
||||
const float fStartX= 0.0f;
|
||||
const float fStartY= 0.0f;
|
||||
|
||||
float fY= fStartY;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float fX= fStartX;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
float fBow= sin( 0.5f * fY );
|
||||
float fVal= fStrength +
|
||||
fAmpliHorz * sin( fSpeedHorz * fTime + fRepHorz * fY ) +
|
||||
fAmpliVert * sin( fSpeedVert * fTime + fRepVert * fX + fTwistVert * fY );
|
||||
|
||||
fVal*= fBow;
|
||||
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
pFloat[ iOffset ]= fVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Create3DMeshPlane(
|
||||
float* pFloat,
|
||||
float fStartX, float fStepX, int iStepsX,
|
||||
float fStartY, float fStepY, int iStepsY
|
||||
)
|
||||
{
|
||||
float fY= fStartY;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float fX= fStartX;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
PreMesh[ iOffset ].Pos.x= fX;
|
||||
PreMesh[ iOffset ].Pos.y= pFloat[ iOffset ];
|
||||
PreMesh[ iOffset ].Pos.z= fY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Create3DMeshCylinder(
|
||||
float* pFloat,
|
||||
float fBaseRadiusX, float fBaseRadiusZ, int iStepsX,
|
||||
float fStartY, float fStepY, int iStepsY
|
||||
)
|
||||
{
|
||||
const float fStepX= c_2PI / (float)( iStepsX - 1 );
|
||||
|
||||
float fY= fStartY;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float fX= 0.0f;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
float fR= pFloat[ iOffset ];
|
||||
PreMesh[ iOffset ].Pos.x= sin( fX ) * ( fR + fBaseRadiusX );
|
||||
PreMesh[ iOffset ].Pos.y= fY;
|
||||
PreMesh[ iOffset ].Pos.z= cos( fX ) * ( fR + fBaseRadiusZ );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Create3DMeshSphere(
|
||||
float* pFloat,
|
||||
float fBaseRadiusX, float fBaseRadiusY, float fBaseRadiusZ,
|
||||
int iStepsX, int iStepsY
|
||||
)
|
||||
{
|
||||
const float fStepX= c_2PI / (float)( iStepsX - 1 );
|
||||
const float Length= c_PI - 0.01f;
|
||||
const float fStepY= Length / (float)( iStepsY - 1 );
|
||||
|
||||
float fY= ( c_PI - Length )* 0.5f;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float SinY= sin( fY );
|
||||
float CosY= cos( fY );
|
||||
|
||||
float fX= 0.0f;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
float fR= pFloat[ iOffset ] * SinY;
|
||||
PreMesh[ iOffset ].Pos.x= SinY * sin( fX ) * ( fR + fBaseRadiusX );
|
||||
PreMesh[ iOffset ].Pos.y= CosY * ( fR + fBaseRadiusY );
|
||||
PreMesh[ iOffset ].Pos.z= SinY * cos( fX ) * ( fR + fBaseRadiusZ );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Create3DMeshTorus(
|
||||
float* pFloat,
|
||||
float fBaseRadiusX, float fBaseRadiusZ,
|
||||
float fInnerRadiusXZ, float fInnerRadiusY,
|
||||
int iStepsX, int iStepsY
|
||||
)
|
||||
{
|
||||
const float fStepX= c_2PI / (float)( iStepsX - 1 );
|
||||
const float fStepY= c_2PI / (float)( iStepsY - 1 );
|
||||
|
||||
float fY= 0.0f;
|
||||
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
|
||||
{
|
||||
float SinY= sin( fY );
|
||||
float CosY= cos( fY );
|
||||
|
||||
float fX= 0.0f;
|
||||
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
float fR= pFloat[ iOffset ];
|
||||
float SinX= sin( fX );
|
||||
float CosX= cos( fX );
|
||||
|
||||
PreMesh[ iOffset ].Pos.x= SinY * ( fBaseRadiusX + CosX * fInnerRadiusXZ + fR);
|
||||
PreMesh[ iOffset ].Pos.y= SinX * ( fInnerRadiusY + fR );
|
||||
PreMesh[ iOffset ].Pos.z= CosY * ( fBaseRadiusZ + CosX * fInnerRadiusXZ + fR );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateBase3DMesh()
|
||||
{
|
||||
}
|
||||
|
||||
void CreateNormals(
|
||||
int iStepsX,
|
||||
int iStepsY
|
||||
)
|
||||
{
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
|
||||
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
|
||||
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
|
||||
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
|
||||
|
||||
D3DXVECTOR3 vec3V(
|
||||
PreMesh[ iOffsetLeft ].Pos - PreMesh[ iOffsetRight ].Pos );
|
||||
D3DXVECTOR3 vec3H(
|
||||
PreMesh[ iOffsetTop ].Pos - PreMesh[ iOffsetBottom ].Pos );
|
||||
D3DXVec3Cross( &PreMesh[ iOffset ].Normal, &vec3V, &vec3H );
|
||||
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal, &PreMesh[ iOffset ].Normal );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateNormalsBreakXY(
|
||||
int iStepsX,
|
||||
int iStepsY
|
||||
)
|
||||
{
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
|
||||
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
|
||||
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
|
||||
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
|
||||
|
||||
if( iX == 0 )
|
||||
{
|
||||
iOffsetRight= iOffset;
|
||||
}
|
||||
if( iX == iStepsX - 1 )
|
||||
{
|
||||
iOffsetLeft= iOffset;
|
||||
}
|
||||
if( iY == 0 )
|
||||
{
|
||||
iOffsetTop= iOffset;
|
||||
}
|
||||
if( iY == iStepsY - 1 )
|
||||
{
|
||||
iOffsetBottom= iOffset;
|
||||
}
|
||||
|
||||
D3DXVECTOR3 vec3V(
|
||||
PreMesh[ iOffsetLeft ].Pos - PreMesh[ iOffsetRight ].Pos );
|
||||
D3DXVECTOR3 vec3H(
|
||||
PreMesh[ iOffsetTop ].Pos - PreMesh[ iOffsetBottom ].Pos );
|
||||
D3DXVec3Cross( &PreMesh[ iOffset ].Normal, &vec3V, &vec3H );
|
||||
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal, &PreMesh[ iOffset ].Normal );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateNormalsBreakX(
|
||||
int iStepsX,
|
||||
int iStepsY
|
||||
)
|
||||
{
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
|
||||
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
|
||||
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
|
||||
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
|
||||
|
||||
if( iX == 0 )
|
||||
{
|
||||
iOffsetRight= iOffset;
|
||||
}
|
||||
if( iX == iStepsX - 1 )
|
||||
{
|
||||
iOffsetLeft= iOffset;
|
||||
}
|
||||
|
||||
D3DXVECTOR3 vec3V(
|
||||
PreMesh[ iOffsetLeft ].Pos - PreMesh[ iOffsetRight ].Pos );
|
||||
D3DXVECTOR3 vec3H(
|
||||
PreMesh[ iOffsetTop ].Pos - PreMesh[ iOffsetBottom ].Pos );
|
||||
D3DXVec3Cross( &PreMesh[ iOffset ].Normal, &vec3V, &vec3H );
|
||||
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal, &PreMesh[ iOffset ].Normal );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateNormalsBreakY(
|
||||
int iStepsX,
|
||||
int iStepsY
|
||||
)
|
||||
{
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
|
||||
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
|
||||
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
|
||||
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
|
||||
|
||||
if( iY == 0 )
|
||||
{
|
||||
iOffsetTop= iOffset;
|
||||
}
|
||||
if( iY == iStepsY - 1 )
|
||||
{
|
||||
iOffsetBottom= iOffset;
|
||||
}
|
||||
|
||||
D3DXVECTOR3 vec3V(
|
||||
PreMesh[ iOffsetLeft ].Pos - PreMesh[ iOffsetRight ].Pos );
|
||||
D3DXVECTOR3 vec3H(
|
||||
PreMesh[ iOffsetTop ].Pos - PreMesh[ iOffsetBottom ].Pos );
|
||||
D3DXVec3Cross( &PreMesh[ iOffset ].Normal, &vec3V, &vec3H );
|
||||
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal, &PreMesh[ iOffset ].Normal );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrepAO(
|
||||
int iStepsX,
|
||||
int iStepsY,
|
||||
float* pFloatHeight,
|
||||
float* pFloatCenterMix,
|
||||
float* pFloatAOVert,
|
||||
float* pFloatAOVHorz,
|
||||
float* pFloatAOIntermediate
|
||||
)
|
||||
{
|
||||
const float fBase= 1.0f / 2.0f;
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
float fHeight= pFloatHeight[ iOffset ];
|
||||
float fMix= pFloatCenterMix[ iOffset ];
|
||||
|
||||
if( fHeight > 0.01f )
|
||||
{
|
||||
pFloatAOIntermediate[ iOffset ]= minimum( ( fMix ) * sqrt( fBase / fHeight ), 0.5f );
|
||||
}
|
||||
else
|
||||
{
|
||||
pFloatAOIntermediate[ iOffset ]= 0.5f;
|
||||
}
|
||||
}
|
||||
}
|
||||
for( int iY= 0; iY < iStepsY; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX; ++iX )
|
||||
{
|
||||
int iOffset= iY * iStepsX + iX;
|
||||
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
|
||||
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
|
||||
|
||||
pFloatAOVHorz[ iOffset ]= pFloatAOIntermediate[ iOffset ] + pFloatAOIntermediate[ iOffsetRight ];
|
||||
pFloatAOVert[ iOffset ]= pFloatAOIntermediate[ iOffset ] + pFloatAOIntermediate[ iOffsetTop ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int CreateFinal3DMesh(
|
||||
int iStepsX,
|
||||
int iStepsY,
|
||||
float* pFloatHeight,
|
||||
float* pFloatCenterMix,
|
||||
float* pFloatAOVert,
|
||||
float* pFloatAOVHorz
|
||||
)
|
||||
{
|
||||
float fBeat= 1.0f - 0.4f * minimum( 1.0f,( g_vuOffBeat.Get( g_dwSamples / 100 ) ) * 0.5f );
|
||||
|
||||
const int VertsPerStep= 30;
|
||||
for( int iY= 0; iY < iStepsY - 1; ++iY )
|
||||
{
|
||||
for( int iX= 0; iX < iStepsX - 1; ++iX )
|
||||
{
|
||||
int iOffsetVert0= iY * iStepsX + iX;
|
||||
int iOffsetVert1= iY * iStepsX + iX + 1;
|
||||
int iOffsetVert2= iY * iStepsX + iX + iStepsX + 1;
|
||||
int iOffsetVert3= iY * iStepsX + iX + iStepsX;
|
||||
|
||||
float fHeight= pFloatHeight[ iOffsetVert0 ] * fBeat;
|
||||
float fMix= pFloatCenterMix[ iOffsetVert0 ];
|
||||
|
||||
D3DXVECTOR3 v4= PreMesh[ iOffsetVert0 ].Pos + PreMesh[ iOffsetVert0 ].Normal * fHeight;
|
||||
D3DXVECTOR3 v5= PreMesh[ iOffsetVert1 ].Pos + PreMesh[ iOffsetVert1 ].Normal * fHeight;
|
||||
D3DXVECTOR3 v6= PreMesh[ iOffsetVert2 ].Pos + PreMesh[ iOffsetVert2 ].Normal * fHeight;
|
||||
D3DXVECTOR3 v7= PreMesh[ iOffsetVert3 ].Pos + PreMesh[ iOffsetVert3 ].Normal * fHeight;
|
||||
|
||||
D3DXVECTOR3 vCenter= 0.25f * ( v4 + v5 + v6 + v7 );
|
||||
|
||||
D3DXVec3Lerp( &v4, &v4, &vCenter, fMix );
|
||||
D3DXVec3Lerp( &v5, &v5, &vCenter, fMix );
|
||||
D3DXVec3Lerp( &v6, &v6, &vCenter, fMix );
|
||||
D3DXVec3Lerp( &v7, &v7, &vCenter, fMix );
|
||||
|
||||
D3DXVECTOR3 n1;
|
||||
D3DXVECTOR3 n2;
|
||||
D3DXVECTOR3 n3;
|
||||
D3DXVECTOR3 n4;
|
||||
{
|
||||
D3DXVECTOR3 v1= PreMesh[ iOffsetVert1 ].Pos - PreMesh[ iOffsetVert0 ].Pos;
|
||||
D3DXVECTOR3 v2= v4 - PreMesh[ iOffsetVert0 ].Pos;
|
||||
D3DXVec3Cross( &n1, &v2, &v1 );
|
||||
D3DXVec3Normalize( &n1, &n1 );
|
||||
}
|
||||
{
|
||||
D3DXVECTOR3 v1= PreMesh[ iOffsetVert2 ].Pos - PreMesh[ iOffsetVert1 ].Pos;
|
||||
D3DXVECTOR3 v2= v5 - PreMesh[ iOffsetVert1 ].Pos;
|
||||
D3DXVec3Cross( &n2, &v2, &v1 );
|
||||
D3DXVec3Normalize( &n2, &n2 );
|
||||
}
|
||||
{
|
||||
D3DXVECTOR3 v1= PreMesh[ iOffsetVert3 ].Pos - PreMesh[ iOffsetVert2 ].Pos;
|
||||
D3DXVECTOR3 v2= v6 - PreMesh[ iOffsetVert2 ].Pos;
|
||||
D3DXVec3Cross( &n3, &v2, &v1 );
|
||||
D3DXVec3Normalize( &n3, &n3 );
|
||||
}
|
||||
{
|
||||
D3DXVECTOR3 v1= PreMesh[ iOffsetVert0 ].Pos - PreMesh[ iOffsetVert3 ].Pos;
|
||||
D3DXVECTOR3 v2= v7 - PreMesh[ iOffsetVert3 ].Pos;
|
||||
D3DXVec3Cross( &n4, &v2, &v1 );
|
||||
D3DXVec3Normalize( &n4, &n4 );
|
||||
}
|
||||
|
||||
|
||||
int iFinalOffset= iY * ( iStepsX - 1 )+ iX;
|
||||
iFinalOffset*= VertsPerStep;
|
||||
|
||||
float AOLeft= pFloatAOVHorz[ iOffsetVert0 ];
|
||||
float AORight= pFloatAOVHorz[ iOffsetVert1 ];
|
||||
float AOTop= pFloatAOVert[ iOffsetVert0 ];
|
||||
float AOBottom= pFloatAOVert[ iOffsetVert3 ];
|
||||
|
||||
DWORD dwNorm= 0xffffffff;
|
||||
DWORD dwLeft= (int)( 255.4f * AOLeft );
|
||||
DWORD dwRight= (int)( 255.4f * AORight );
|
||||
DWORD dwTop= (int)( 255.4f * AOTop );
|
||||
DWORD dwBottom= (int)( 255.4f * AOBottom );
|
||||
dwLeft= dwLeft << 16 | dwLeft << 8 | dwLeft | 0xff000000;
|
||||
dwRight= dwRight << 16 | dwRight << 8 | dwRight | 0xff000000;
|
||||
dwTop= dwTop << 16 | dwTop << 8 | dwTop | 0xff000000;
|
||||
dwBottom= dwBottom << 16 | dwBottom << 8 | dwBottom | 0xff000000;
|
||||
|
||||
|
||||
// Deckel
|
||||
FinalMesh[ iFinalOffset ].Pos= v4;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert0 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v5;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert1 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v7;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert3 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v5;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert1 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v6;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert2 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v7;
|
||||
FinalMesh[ iFinalOffset ].Normal= PreMesh[ iOffsetVert3 ].Normal;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
// Flanke oben
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert0 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwTop;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert1 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwTop;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v4;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert1 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwTop;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v5;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v4;
|
||||
FinalMesh[ iFinalOffset ].Normal= n1;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
// Flanke rechts
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert1 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwRight;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert2 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwRight;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v5;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert2 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwRight;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v6;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v5;
|
||||
FinalMesh[ iFinalOffset ].Normal= n2;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
// Flanke unten
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert2 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwBottom;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert3 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwBottom;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v6;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert3 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwBottom;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v7;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v6;
|
||||
FinalMesh[ iFinalOffset ].Normal= n3;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
// Flanke links
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert3 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwLeft;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert0 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwLeft;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v7;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= PreMesh[ iOffsetVert0 ].Pos;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwLeft;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v4;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
|
||||
FinalMesh[ iFinalOffset ].Pos= v7;
|
||||
FinalMesh[ iFinalOffset ].Normal= n4;
|
||||
FinalMesh[ iFinalOffset ].dwColor= dwNorm;
|
||||
iFinalOffset++;
|
||||
}
|
||||
}
|
||||
|
||||
return VertsPerStep * ( iStepsX - 1 ) * ( iStepsY - 1 ) / 3;
|
||||
}
|
||||
|
||||
void Create2DFunc(
|
||||
int FuncType,
|
||||
int iParamBank,
|
||||
float* pFloat,
|
||||
int iSizeX,
|
||||
int iSizeY,
|
||||
float fTime )
|
||||
{
|
||||
switch( FuncType )
|
||||
{
|
||||
case -1:
|
||||
{
|
||||
for( int i= 0; i < iSizeX * iSizeY; ++i )
|
||||
{
|
||||
pFloat[ i ]= 0.0f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
{
|
||||
for( int i= 0; i < iSizeX * iSizeY; ++i )
|
||||
{
|
||||
pFloat[ i ]= GetFloatParam( iParamBank, FuncType );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
const float fPiX= c_2PI / (float)( iSizeX - 1 );
|
||||
const float fPiY= c_2PI / (float)( iSizeY - 1 );
|
||||
|
||||
CreateFloatFieldPlasma(
|
||||
iParamBank, // ParamBank,
|
||||
pFloat, // pFloat,
|
||||
fPiX, // fStepX
|
||||
iSizeX, // iStepsX,
|
||||
fPiY, // fStepY
|
||||
iSizeY, // iStepsY
|
||||
fTime );
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
const float fPiX= c_2PI / (float)( iSizeX - 1 );
|
||||
const float fPiY= c_2PI / (float)( iSizeY - 1 );
|
||||
|
||||
CreateTwistedBow(
|
||||
iParamBank, // ParamBank,
|
||||
pFloat, // pFloat,
|
||||
fPiX, // fStepX
|
||||
iSizeX, // iStepsX,
|
||||
fPiY, // fStepY
|
||||
iSizeY, // iStepsY
|
||||
fTime );
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int PrepMesh( SObjectDescription* pObj, float fTime )
|
||||
{
|
||||
const int iSizeX= pObj->m_iSizeX;
|
||||
const int iSizeY= pObj->m_iSizeY;
|
||||
|
||||
Create2DFunc(
|
||||
pObj->m_iOffsetFunc,
|
||||
pObj->m_iOffsetBank,
|
||||
PreFloats,
|
||||
iSizeX,
|
||||
iSizeY,
|
||||
fTime);
|
||||
|
||||
|
||||
switch( pObj->m_iBaseMeshType )
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
const float fPlaneSizeX= GetFloatParam( pObj->m_iBaseBank, 0 );
|
||||
const float fPlaneSizeY= GetFloatParam( pObj->m_iBaseBank, 1 );
|
||||
|
||||
float fPlaneStepX= 2.0f * fPlaneSizeX / (float)( iSizeX - 1 );
|
||||
float fPlaneStepY= 2.0f * fPlaneSizeY / (float)( iSizeY - 1 );
|
||||
|
||||
Create3DMeshPlane(
|
||||
PreFloats, // pFloat,
|
||||
-fPlaneSizeX, // fStartX
|
||||
fPlaneStepX, // fStepX
|
||||
iSizeX, // iStepsX,
|
||||
-fPlaneSizeY, // fStartY
|
||||
fPlaneStepY, // fStepY
|
||||
iSizeY // iStepsY
|
||||
);
|
||||
|
||||
CreateNormalsBreakXY(
|
||||
iSizeX,
|
||||
iSizeY
|
||||
);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
const float fBaseRadiusX= GetFloatParam( pObj->m_iBaseBank, 0 );
|
||||
const float fBaseRadiusZ= GetFloatParam( pObj->m_iBaseBank, 1 );
|
||||
const float fCylinderSizeY= GetFloatParam( pObj->m_iBaseBank, 2 );
|
||||
|
||||
float fCylinderStepY= 2.0f * fCylinderSizeY / (float)( iSizeY - 1 );
|
||||
|
||||
Create3DMeshCylinder(
|
||||
PreFloats, // float* pFloat,
|
||||
fBaseRadiusX, // float fBaseRadiusX,
|
||||
fBaseRadiusZ, // float fBaseRadiusZ,
|
||||
iSizeX, // int iStepsX,
|
||||
-fCylinderSizeY, // float fStartY,
|
||||
fCylinderStepY, // float fStepY,
|
||||
iSizeY // int iStepsY
|
||||
);
|
||||
CreateNormalsBreakY(
|
||||
iSizeX,
|
||||
iSizeY
|
||||
);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
const float fBaseRadiusX= GetFloatParam( pObj->m_iBaseBank, 0 );
|
||||
const float fBaseRadiusY= GetFloatParam( pObj->m_iBaseBank, 1 );
|
||||
const float fBaseRadiusZ= GetFloatParam( pObj->m_iBaseBank, 2 );
|
||||
|
||||
Create3DMeshSphere(
|
||||
PreFloats, // float* pFloat,
|
||||
fBaseRadiusX, // fBaseRadiusX
|
||||
fBaseRadiusY, // fBaseRadiusY
|
||||
fBaseRadiusZ, // fBaseRadiusZ
|
||||
iSizeX, // int iStepsX,
|
||||
iSizeY // int iStepsY,
|
||||
);
|
||||
CreateNormalsBreakY(
|
||||
iSizeX,
|
||||
iSizeY
|
||||
);
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
Create3DMeshTorus(
|
||||
PreFloats, // float* pFloat,
|
||||
GetFloatParam( pObj->m_iBaseBank, 0 ),
|
||||
GetFloatParam( pObj->m_iBaseBank, 1 ),
|
||||
GetFloatParam( pObj->m_iBaseBank, 2 ),
|
||||
GetFloatParam( pObj->m_iBaseBank, 3 ),
|
||||
iSizeX, // int iStepsX,
|
||||
iSizeY // int iStepsY,
|
||||
);
|
||||
CreateNormals(
|
||||
iSizeX,
|
||||
iSizeY
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Create2DFunc(
|
||||
pObj->m_iHeightFunc,
|
||||
pObj->m_iHeightBank,
|
||||
PreFloat(1),
|
||||
iSizeX,
|
||||
iSizeY,
|
||||
fTime );
|
||||
|
||||
Create2DFunc(
|
||||
pObj->m_iMixFunc,
|
||||
pObj->m_iMixBank,
|
||||
PreFloat(2),
|
||||
iSizeX,
|
||||
iSizeY,
|
||||
fTime );
|
||||
|
||||
PrepAO(
|
||||
iSizeX,
|
||||
iSizeY ,
|
||||
PreFloat(1), // pFloatHeight,
|
||||
PreFloat(2), // pFloatCenterMix,
|
||||
PreFloat(3), // pFloatAOVert,
|
||||
PreFloat(4), // pFloatAOVHorz
|
||||
PreFloat(5) // Intermediate
|
||||
);
|
||||
|
||||
return CreateFinal3DMesh(
|
||||
iSizeX,
|
||||
iSizeY ,
|
||||
PreFloat(1), // pFloatHeight,
|
||||
PreFloat(2), // pFloatCenterMix,
|
||||
PreFloat(3), // pFloatAOVert,
|
||||
PreFloat(4) // pFloatAOVHorz
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
void CreateInterpolationMatrix(
|
||||
D3DXMATRIX* pMat,
|
||||
int iBank,
|
||||
float fTime)
|
||||
{
|
||||
|
||||
D3DXVECTOR3 vecPos(
|
||||
GetFloatParam( iBank, 0 ),
|
||||
GetFloatParam( iBank, 1 ),
|
||||
GetFloatParam( iBank, 2 ) );
|
||||
D3DXVECTOR3 vecPos2(
|
||||
GetFloatParam( iBank + 1, 0 ),
|
||||
GetFloatParam( iBank + 1, 1 ),
|
||||
GetFloatParam( iBank + 1, 2 ) );
|
||||
D3DXVECTOR3 vecRot(
|
||||
GetFloatParam( iBank + 2, 0 ),
|
||||
GetFloatParam( iBank + 2, 1 ),
|
||||
GetFloatParam( iBank + 2, 2 ) );
|
||||
D3DXVECTOR3 vecRot2(
|
||||
GetFloatParam( iBank + 3, 0 ),
|
||||
GetFloatParam( iBank + 3, 1 ),
|
||||
GetFloatParam( iBank + 3, 2 ) );
|
||||
vecPos+= vecPos2 * fTime * GetFloatParam( iBank + 1, 3 );
|
||||
vecRot+= vecRot2 * fTime * GetFloatParam( iBank + 3, 3 );
|
||||
vecRot*= c_2PI;
|
||||
|
||||
D3DXMATRIX matPos;
|
||||
D3DXMatrixTranslation( &matPos, vecPos.x, vecPos.y, vecPos.z );
|
||||
|
||||
D3DXMATRIX matRot;
|
||||
D3DXMatrixRotationYawPitchRoll( &matRot, vecRot.x, vecRot.y, vecRot.z );
|
||||
|
||||
*pMat= matRot * matPos;
|
||||
}
|
||||
|
||||
void SetTransformation( SObjectDescription* pObj, float fTime )
|
||||
{
|
||||
D3DXMATRIX mat;
|
||||
|
||||
switch( pObj->m_iTransformFunc )
|
||||
{
|
||||
case 0:
|
||||
D3DXMatrixIdentity( &mat );
|
||||
break;
|
||||
case 1:
|
||||
CreateInterpolationMatrix( &mat, pObj->m_iTransformBank, fTime );
|
||||
break;
|
||||
}
|
||||
|
||||
g_d3d_device->SetTransform( D3DTS_WORLD, &mat );
|
||||
}
|
||||
|
||||
void RenderMesh( SObjectDescription* pObj, float fTime )
|
||||
{
|
||||
g_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
|
||||
|
||||
g_d3d_device->SetLight( 0, &d3dLight[ 0 ] );
|
||||
g_d3d_device->LightEnable( 0, TRUE );
|
||||
g_d3d_device->SetLight( 1, &d3dLight[ 1 ] );
|
||||
g_d3d_device->LightEnable( 1, TRUE );
|
||||
g_d3d_device->SetLight( 2, &d3dLight[ 2 ] );
|
||||
g_d3d_device->LightEnable( 2, TRUE );
|
||||
|
||||
|
||||
g_d3d_device->SetRenderState( D3DRS_ZENABLE, TRUE );
|
||||
|
||||
g_d3d_device->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
|
||||
g_d3d_device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
|
||||
|
||||
g_d3d_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
|
||||
|
||||
g_d3d_device->SetRenderState( D3DRS_TEXTUREFACTOR, pObj->m_dwColor );
|
||||
|
||||
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
|
||||
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
||||
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
|
||||
|
||||
//g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
|
||||
//g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
||||
|
||||
|
||||
D3DXMATRIX mat;
|
||||
|
||||
|
||||
D3DXMatrixIdentity( &mat );
|
||||
g_d3d_device->SetTransform( D3DTS_WORLD, &mat );
|
||||
|
||||
|
||||
SetTransformation( pObj, fTime );
|
||||
|
||||
{
|
||||
g_d3d_device->SetFVF( c_dwFVFMesh );
|
||||
|
||||
int iPrimCount= PrepMesh( pObj, fTime );
|
||||
SVertexMesh* pVertices= FinalMesh;
|
||||
while( iPrimCount > 0 )
|
||||
{
|
||||
int iActPrimCount= iPrimCount;
|
||||
if( iActPrimCount > 16384 )
|
||||
{
|
||||
iActPrimCount= 16384;
|
||||
}
|
||||
g_d3d_device->DrawPrimitiveUP(
|
||||
D3DPT_TRIANGLELIST,
|
||||
iActPrimCount,
|
||||
pVertices,
|
||||
sizeof( SVertexMesh )
|
||||
);
|
||||
pVertices+= iActPrimCount * 3;
|
||||
iPrimCount-= iActPrimCount;
|
||||
}
|
||||
}
|
||||
|
||||
}*/
|
||||
|
||||
Reference in New Issue
Block a user