port from perforce
This commit is contained in:
802
evoke-64k/bp10/city.cpp
Normal file
802
evoke-64k/bp10/city.cpp
Normal file
@@ -0,0 +1,802 @@
|
||||
#include "defines.h"
|
||||
#include "globals.h"
|
||||
#include "intrin.h"
|
||||
#include "city.h"
|
||||
|
||||
float g_fBlocksX[ 24 ];
|
||||
float g_fBlocksY[ 24 ];
|
||||
int g_iStreetCountX;
|
||||
float g_fStreetX[ 24 ];
|
||||
int g_iStreetCountY;
|
||||
float g_fStreetY[ 24 ];
|
||||
|
||||
void GenerateMap()
|
||||
{
|
||||
g_iStreetCountX= 0;
|
||||
float fMinStep= 17.0f;
|
||||
float fMinStreet= 6.0f;
|
||||
float fMaxStreet= 16.0f;
|
||||
{
|
||||
float fPosX[ 2 ];
|
||||
fPosX[ 0 ]= fMinStep / 2.0f;
|
||||
fPosX[ 1 ]= -fMinStep / 2.0f;
|
||||
int iWait[ 2 ];
|
||||
iWait[ 0 ] = 0;
|
||||
iWait[ 1 ] = 0;
|
||||
|
||||
for( int i= 0; i < 12; ++i )
|
||||
{
|
||||
g_fBlocksX[ 12 + i ]= fPosX[ 0 ];
|
||||
g_fBlocksX[ 11 - i ]= fPosX[ 1 ];
|
||||
fPosX[ 0 ]+= fMinStep;
|
||||
fPosX[ 1 ]-= fMinStep;
|
||||
iWait[ 0 ]--;
|
||||
iWait[ 1 ]--;
|
||||
if( iWait[ 0 ] < 0 )
|
||||
{
|
||||
fPosX[ 0 ]+= g_Random.genFloat( fMinStreet, fMaxStreet );
|
||||
iWait[ 0 ]= g_Random.genInteger( 1, 3 );
|
||||
g_fStreetX[ g_iStreetCountX ]= ( g_fBlocksX[ 12 + i ] + fPosX[ 0 ] ) / 2.0f;
|
||||
g_iStreetCountX++;
|
||||
}
|
||||
if( iWait[ 1 ] < 0 )
|
||||
{
|
||||
fPosX[ 1 ]-= g_Random.genFloat( fMinStreet, fMaxStreet );
|
||||
iWait[ 1 ]= g_Random.genInteger( 1, 3 );
|
||||
g_fStreetX[ g_iStreetCountX ]= ( g_fBlocksX[ 11 - i ] + fPosX[ 1 ] ) / 2.0f;
|
||||
g_iStreetCountX++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_iStreetCountY= 0;
|
||||
{
|
||||
float fPosY[ 2 ];
|
||||
fPosY[ 0 ]= fMinStep / 2.0f;
|
||||
fPosY[ 1 ]= -fMinStep / 2.0f;
|
||||
for( int i= 0; i < 12; ++i )
|
||||
{
|
||||
g_fBlocksY[ 12 + i ]= fPosY[ 0 ];
|
||||
g_fBlocksY[ 11 - i ]= fPosY[ 1 ];
|
||||
fPosY[ 0 ]+= fMinStep;
|
||||
fPosY[ 1 ]-= fMinStep;
|
||||
if( i % 2 == 0 )
|
||||
{
|
||||
fPosY[ 0 ]+= g_Random.genFloat( fMinStreet, fMaxStreet );
|
||||
fPosY[ 1 ]-= g_Random.genFloat( fMinStreet, fMaxStreet );
|
||||
g_fStreetY[ g_iStreetCountY ]= ( g_fBlocksY[ 12 + i ] + fPosY[ 0 ] ) / 2.0f;
|
||||
g_iStreetCountY++;
|
||||
g_fStreetY[ g_iStreetCountY ]= ( g_fBlocksY[ 11 - i ] + fPosY[ 1 ] ) / 2.0f;
|
||||
g_iStreetCountY++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CreateAllBuildings()
|
||||
{
|
||||
g_Random.setSeed( 5 );
|
||||
GenerateMap();
|
||||
|
||||
int iIndex= OI_BuildingFirst;
|
||||
int iBuilding= 0;
|
||||
bool bUnlock= false;
|
||||
for( int iX= 0; iX < 24; ++iX )
|
||||
{
|
||||
for( int iY= 0; iY < 24; ++iY )
|
||||
{
|
||||
float fY= g_fBlocksY[ iY ];
|
||||
float fX= g_fBlocksX[ iX ];
|
||||
float fHeight= GetCityHeight( fX, fY );
|
||||
if( fHeight <= 0.0f )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if( iBuilding % 5 == 0 )
|
||||
{
|
||||
if( bUnlock )
|
||||
{
|
||||
g_pEditObject->Unlock();
|
||||
}
|
||||
g_pEditObject= g_Objects + iIndex;
|
||||
assert( iIndex <= OI_BuildingLast );
|
||||
g_pEditObject->Create( 24 * 1000, 36 * 1000 );
|
||||
g_pEditObject->m_iUsedPreShader= PreDepth;
|
||||
g_pEditObject->m_iUsedShader[0]= Wall;
|
||||
g_pEditObject->Lock();
|
||||
bUnlock= true;
|
||||
iIndex++;
|
||||
}
|
||||
|
||||
iBuilding++;
|
||||
if( g_Random.genInteger( 0, 5 ) == 0 )
|
||||
{
|
||||
CreateBuilding00( D3DXVECTOR3( fX, 0.0f, fY), fHeight * 1.0f );
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateBuilding01( D3DXVECTOR3( fX, 0.0f, fY), fHeight * 1.0f );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if( bUnlock )
|
||||
{
|
||||
g_pEditObject->Unlock();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
float GetCityHeight( float fX, float fY )
|
||||
{
|
||||
if( fabs( fX ) + fabs( fY ) < 32.0f )
|
||||
{
|
||||
return -1.0f;
|
||||
}
|
||||
float fBase= 2048.0f / sqrt( 2.5f * fX * fX + fY * fY ) - 10.0f;
|
||||
fBase-= 2.0f * ( cos( fX / 23.7f + 4.6f * cos( fY / 97.3f ) ) + cos( fY / 27.7f + 2.1f * cos( fX / 43.0f ) ) );
|
||||
|
||||
return fBase;
|
||||
}
|
||||
|
||||
void CreateSlicesX( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor,
|
||||
int Slices, int SliceMode, float fSliceFac )
|
||||
{
|
||||
if( Slices > -1 )
|
||||
{
|
||||
int iSliceCount= Slices;
|
||||
float fSliceSize= 2.0f * fSliceFac * vecExtent.x / (float)( Slices + 1 );
|
||||
float fSliceApart= ( vecExtent.x * 2.0f - fSliceSize ) / (float)( Slices + 1 );
|
||||
float fSliceStart= - vecExtent.x + fSliceSize * 0.5f;
|
||||
|
||||
int iStart= ( SliceMode & 1 ) ? 0 : 1;
|
||||
int iEnd= iSliceCount + ( ( SliceMode & 2 ) ? 1 : 0 );
|
||||
|
||||
for( int i= iStart; i <= iEnd; ++i )
|
||||
{
|
||||
D3DXVECTOR3 v( fSliceStart + (float)i * fSliceApart, 0.0f, 0.0f );
|
||||
|
||||
D3DXMATRIX m1;
|
||||
D3DXMatrixRotationYawPitchRoll( &m1, vecRot.x, vecRot.y, vecRot.z );
|
||||
|
||||
D3DXVec3TransformCoord( &v, &v, &m1 );
|
||||
|
||||
g_pEditObject->AddBox(
|
||||
D3DXVECTOR3( vecCenter + v ),
|
||||
D3DXVECTOR3( fSliceSize * 0.5f, vecExtent.y, vecExtent.z),
|
||||
D3DXVECTOR3( vecRot.x, vecRot.y, vecRot.z),
|
||||
dwColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateSlicesY( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor,
|
||||
int Slices, int SliceMode, float fSliceFac )
|
||||
{
|
||||
if( Slices > -1 )
|
||||
{
|
||||
int iSliceCount= Slices;
|
||||
float fSliceSize= 2.0f * fSliceFac * vecExtent.y / (float)( Slices + 1 );
|
||||
float fSliceApart= ( vecExtent.y * 2.0f - fSliceSize ) / (float)( Slices + 1 );
|
||||
float fSliceStart= - vecExtent.y + fSliceSize * 0.5f;
|
||||
|
||||
int iStart= ( SliceMode & 1 ) ? 0 : 1;
|
||||
int iEnd= iSliceCount + ( ( SliceMode & 2 ) ? 1 : 0 );
|
||||
|
||||
for( int i= iStart; i <= iEnd; ++i )
|
||||
{
|
||||
D3DXVECTOR3 v( 0.0f, fSliceStart + (float)i * fSliceApart, 0.0f );
|
||||
|
||||
D3DXMATRIX m1;
|
||||
D3DXMatrixRotationYawPitchRoll( &m1, vecRot.x, vecRot.y, vecRot.z );
|
||||
|
||||
D3DXVec3TransformCoord( &v, &v, &m1 );
|
||||
|
||||
g_pEditObject->AddBox(
|
||||
D3DXVECTOR3( vecCenter + v ),
|
||||
D3DXVECTOR3( vecExtent.x, fSliceSize * 0.5f, vecExtent.z),
|
||||
D3DXVECTOR3( vecRot.x, vecRot.y, vecRot.z),
|
||||
dwColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateSlicesZ( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor,
|
||||
int Slices, int SliceMode, float fSliceFac )
|
||||
{
|
||||
if( Slices > -1 )
|
||||
{
|
||||
int iSliceCount= Slices;
|
||||
float fSliceSize= 2.0f * fSliceFac * vecExtent.z / (float)( Slices + 1 );
|
||||
float fSliceApart= ( vecExtent.z * 2.0f - fSliceSize ) / (float)( Slices + 1 );
|
||||
float fSliceStart= -vecExtent.z + fSliceSize * 0.5f;
|
||||
|
||||
int iStart= ( SliceMode & 1 ) ? 0 : 1;
|
||||
int iEnd= iSliceCount + ( ( SliceMode & 2 ) ? 1 : 0 );
|
||||
|
||||
for( int i= iStart; i <= iEnd; ++i )
|
||||
{
|
||||
D3DXVECTOR3 v( 0.0f, 0.0f, fSliceStart + (float)i * fSliceApart );
|
||||
|
||||
D3DXMATRIX m1;
|
||||
D3DXMatrixRotationYawPitchRoll( &m1, vecRot.x, vecRot.y, vecRot.z );
|
||||
|
||||
D3DXVec3TransformCoord( &v, &v, &m1 );
|
||||
|
||||
g_pEditObject->AddBox(
|
||||
D3DXVECTOR3( vecCenter + v ),
|
||||
D3DXVECTOR3( vecExtent.x, vecExtent.y, fSliceSize * 0.5f),
|
||||
D3DXVECTOR3( vecRot.x, vecRot.y, vecRot.z),
|
||||
dwColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateRoof( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor,
|
||||
int Type,
|
||||
float fParams[ 4 ] )
|
||||
{
|
||||
if( Type == 0 )
|
||||
{
|
||||
float fHeight= 0.25f + fParams[ 0 ] * 0.25f;
|
||||
float fSub= 0.25f + fParams[ 1 ] * 0.25f;
|
||||
|
||||
g_pEditObject->AddBox(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + 2.0f * vecExtent.y + fHeight, vecCenter.z ),
|
||||
D3DXVECTOR3( vecExtent.x - fSub, fHeight, vecExtent.z - fSub),
|
||||
D3DXVECTOR3( vecRot.x, vecRot.y, vecRot.z ),
|
||||
dwColor);
|
||||
}
|
||||
if( Type == 1 )
|
||||
{
|
||||
float fHeight= 0.05f + fParams[ 0 ] * 0.1f;
|
||||
float fFrac= 0.05f + fParams[ 1 ] * 0.1f;
|
||||
float fSub= 0.0f;
|
||||
|
||||
CreateSlicesX(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + 2.0f * vecExtent.y + fHeight, vecCenter.z ),
|
||||
D3DXVECTOR3( vecExtent.x - fSub, fHeight, vecExtent.z - fSub),
|
||||
vecRot,
|
||||
dwColor,
|
||||
0, 3, fFrac );
|
||||
CreateSlicesZ(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + 2.0f * vecExtent.y + fHeight, vecCenter.z ),
|
||||
D3DXVECTOR3( vecExtent.x - fSub, fHeight, vecExtent.z - fSub),
|
||||
vecRot,
|
||||
dwColor,
|
||||
0, 3, fFrac );
|
||||
|
||||
}
|
||||
if( Type == 2 )
|
||||
{
|
||||
float fHeight= 0.25f + fParams[ 0 ] * 0.25f;
|
||||
float fFrac= 0.05f + fParams[ 1 ] * 0.025f;
|
||||
float fSub= 0.5f + fParams[ 2 ] * 0.5f;
|
||||
|
||||
CreateSlicesX(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + 2.0f * vecExtent.y + fHeight, vecCenter.z ),
|
||||
D3DXVECTOR3( vecExtent.x - fSub, fHeight, vecExtent.z - fSub),
|
||||
vecRot,
|
||||
dwColor,
|
||||
0, 3, fFrac );
|
||||
CreateSlicesZ(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + 2.0f * vecExtent.y + fHeight, vecCenter.z ),
|
||||
D3DXVECTOR3( vecExtent.x - fSub, fHeight, vecExtent.z - fSub),
|
||||
vecRot,
|
||||
dwColor,
|
||||
0, 3, fFrac );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void CreateTower( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor,
|
||||
float fInner1X, float fInner2X, float fInner1Z, float fInner2Z,
|
||||
int SlicesX, int SlicesZ, int SlicesY,
|
||||
float fSliceFacX, float fSliceFacZ, float fSliceFacY )
|
||||
{
|
||||
g_pEditObject->AddBox(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + vecExtent.y, vecCenter.z),
|
||||
D3DXVECTOR3( vecExtent.x - fInner2X, vecExtent.y, vecExtent.z - fInner2Z),
|
||||
vecRot,
|
||||
dwColor);
|
||||
|
||||
CreateSlicesX(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + vecExtent.y, vecCenter.z),
|
||||
D3DXVECTOR3( vecExtent.x - fInner2X, vecExtent.y, vecExtent.z - fInner1Z),
|
||||
vecRot,
|
||||
dwColor,
|
||||
SlicesX, 0, fSliceFacX );
|
||||
CreateSlicesZ(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + vecExtent.y, vecCenter.z),
|
||||
D3DXVECTOR3( vecExtent.x - fInner1X, vecExtent.y, vecExtent.z - fInner2Z ),
|
||||
vecRot,
|
||||
dwColor,
|
||||
SlicesZ, 0, fSliceFacZ );
|
||||
CreateSlicesY(
|
||||
D3DXVECTOR3( vecCenter.x, vecCenter.y + vecExtent.y + 1.0f / 64.0f , vecCenter.z),
|
||||
D3DXVECTOR3( vecExtent.x, vecExtent.y, vecExtent.z),
|
||||
vecRot,
|
||||
dwColor,
|
||||
SlicesY, 2, fSliceFacY );
|
||||
}
|
||||
|
||||
void CreateAdd( const D3DXVECTOR3& vecCenter,
|
||||
const D3DXVECTOR3& vecExtent,
|
||||
const D3DXVECTOR3& vecRot,
|
||||
DWORD dwColor )
|
||||
{
|
||||
}
|
||||
|
||||
void MakeRoundPoint( float fAngle, float fHeightFac, D3DXVECTOR3& v, float MainSize[ 3 ], float fReduce )
|
||||
{
|
||||
v.x= -sin( fAngle ) * ( MainSize[ 0 ] - fReduce );
|
||||
v.y= fHeightFac * MainSize[ 2 ];
|
||||
v.z= cos( fAngle ) * ( MainSize[ 1 ] - fReduce );
|
||||
}
|
||||
|
||||
void CreateBuilding00( const D3DXVECTOR3& vecPos, float fAddHeight )
|
||||
{
|
||||
float fHeight= g_Random.genFloat();
|
||||
fHeight= fHeight * fHeight * 12.0f + 10.0f + fAddHeight;
|
||||
int iStories= (int)( fHeight / 2.6f );
|
||||
float fStoryFrac= g_Random.genFloat( 2.0f / 64.0f, 5.0f / 64.0f ) / (float)iStories;
|
||||
|
||||
const float fMaxSize= 8.0f;
|
||||
float MainSize[ 3 ]= { fMaxSize, fMaxSize, fHeight };
|
||||
MainSize[ g_Random.genInteger( 0, 1 ) ]= fMaxSize * g_Random.genFloat( 0.66f, 1.0f );
|
||||
|
||||
int iWindowCount= g_Random.genInteger( 16, 28 );
|
||||
|
||||
float fWindowPart= g_Random.genFloat( 0.125f, 0.1875f );
|
||||
float fWindowDepth[ 2 ]=
|
||||
{
|
||||
g_Random.genFloat( 0.0625f, 0.125f ),
|
||||
g_Random.genFloat( 0.375f, 0.5f )
|
||||
};
|
||||
|
||||
if( g_Random.genInteger( 0, 1 ) == 1 )
|
||||
{
|
||||
fWindowPart= 1.0f - fWindowPart;
|
||||
}
|
||||
|
||||
for( int i= 0; i < iWindowCount; ++i )
|
||||
{
|
||||
float fAngle[ 3 ]=
|
||||
{
|
||||
(float)i / (float)iWindowCount * c_2PI,
|
||||
0.0f,
|
||||
(float)(i + 1 )/ (float)iWindowCount * c_2PI
|
||||
};
|
||||
fAngle[ 1 ] = fAngle[ 0 ] * fWindowPart + fAngle[ 2 ] * ( 1.0f - fWindowPart );
|
||||
float fHeightFac[ 2 ]= { 0.0f, 1.0f };
|
||||
|
||||
float fReduce= fWindowDepth[ 0 ];
|
||||
for( int j= 0; j < 2; ++j )
|
||||
{
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle[ j ], fHeightFac[ 0 ], v1, MainSize, fReduce );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle[ j ], fHeightFac[ 1 ], v2, MainSize, fReduce );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 0 ], v3, MainSize, fReduce );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 1 ], v4, MainSize, fReduce );
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 0 ], v1, MainSize, fReduce );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 1 ], v2, MainSize, fReduce );
|
||||
fReduce= fabs( fReduce - fWindowDepth[ 1 ] );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 0 ], v3, MainSize, fReduce );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle[ j + 1], fHeightFac[ 1 ], v4, MainSize, fReduce );
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float fAngleOffset= 0.0f;
|
||||
if( fWindowPart < 0.5f )
|
||||
{
|
||||
fAngleOffset= fWindowPart / (float)iWindowCount * c_PI;
|
||||
}
|
||||
else
|
||||
{
|
||||
fAngleOffset= ( - 1.0f + fWindowPart ) / (float)iWindowCount * c_PI;
|
||||
}
|
||||
|
||||
float fAngleStep= 1.0f / (float)iWindowCount * c_2PI;
|
||||
float fReduce= g_Random.genFloat( -0.125f, 0.0625f );
|
||||
float fReduceInner= 1.0f;
|
||||
for( int iStory= 0; iStory < iStories; ++iStory )
|
||||
{
|
||||
float fHeightFac= (float)(iStory) / (float)iStories;
|
||||
|
||||
for( int i= 0; i < iWindowCount; ++i )
|
||||
{
|
||||
float fAngle= (float)i * fAngleStep - fAngleOffset;
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle, fHeightFac - fStoryFrac, v1, MainSize, fReduce );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle, fHeightFac + fStoryFrac, v2, MainSize, fReduce );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac - fStoryFrac, v3, MainSize, fReduce );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac + fStoryFrac, v4, MainSize, fReduce );
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle, fHeightFac - fStoryFrac, v1, MainSize, fReduceInner );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle, fHeightFac - fStoryFrac, v2, MainSize, fReduce );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac - fStoryFrac, v3, MainSize, fReduceInner );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac - fStoryFrac, v4, MainSize, fReduce );
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle, fHeightFac + fStoryFrac, v1, MainSize, fReduce );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle, fHeightFac + fStoryFrac, v2, MainSize, fReduceInner );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac + fStoryFrac, v3, MainSize, fReduce );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle + fAngleStep, fHeightFac + fStoryFrac, v4, MainSize, fReduceInner );
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float fRoofBorderHeight= g_Random.genFloat( 0.5f, 1.0f );
|
||||
float fRoofBorderWidth= g_Random.genFloat( 0.8f, 0.9f );
|
||||
|
||||
float fRoofHeights[ 24 ];
|
||||
float fRoofSize[ 24 ];
|
||||
int iRoofCount= 0;
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= 0.75f;
|
||||
iRoofCount++;
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= 1.0f;
|
||||
iRoofCount++;
|
||||
fHeight+= fRoofBorderHeight;
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= 1.0f;
|
||||
iRoofCount++;
|
||||
|
||||
if( g_Random.genInteger( 0, 1 ) == 0 )
|
||||
{
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= fRoofBorderWidth;
|
||||
iRoofCount++;
|
||||
fHeight-= fRoofBorderHeight * g_Random.genFloat( 0.1f, 0.5f );
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= fRoofBorderWidth;
|
||||
iRoofCount++;
|
||||
}
|
||||
|
||||
fRoofHeights[ iRoofCount ]= fHeight;
|
||||
fRoofSize[ iRoofCount ]= 0.0f;
|
||||
iRoofCount++;
|
||||
|
||||
for( int Roof= 1; Roof < iRoofCount; ++Roof )
|
||||
{
|
||||
for( int i= 0; i < iWindowCount; ++i )
|
||||
{
|
||||
float fAngle= (float)i * fAngleStep - fAngleOffset;
|
||||
{
|
||||
D3DXVECTOR3 v1;
|
||||
MakeRoundPoint( fAngle, 0.0f, v1, MainSize, 0.0f );
|
||||
D3DXVECTOR3 v2;
|
||||
MakeRoundPoint( fAngle, 0.0f, v2, MainSize, 0.0f );
|
||||
D3DXVECTOR3 v3;
|
||||
MakeRoundPoint( fAngle + fAngleStep, 0.0f, v3, MainSize, 0.0f );
|
||||
D3DXVECTOR3 v4;
|
||||
MakeRoundPoint( fAngle + fAngleStep, 0.0f, v4, MainSize, 0.0f );
|
||||
v1*= fRoofSize[ Roof -1];
|
||||
v1.y= fRoofHeights[ Roof -1];
|
||||
v2*= fRoofSize[ Roof ];
|
||||
v2.y= fRoofHeights[ Roof ];
|
||||
v3*= fRoofSize[ Roof -1];
|
||||
v3.y= fRoofHeights[ Roof -1];
|
||||
v4*= fRoofSize[ Roof ];
|
||||
v4.y= fRoofHeights[ Roof ];
|
||||
|
||||
g_pEditObject->AddQuadFlat(
|
||||
v1 + vecPos,
|
||||
v2 + vecPos,
|
||||
v3 + vecPos,
|
||||
v4 + vecPos,
|
||||
0xffc0c0c0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateBuilding01( const D3DXVECTOR3& vecPos, float fAddHeight )
|
||||
{
|
||||
float fHeight= g_Random.genFloat();
|
||||
fHeight= fHeight * fHeight * 12.0f + 10.0f + fAddHeight;
|
||||
int iStories= (int)( fHeight / 2.6f );
|
||||
float fStoryFrac= g_Random.genFloat( 2.0f / 64.0f, 5.0f / 64.0f );
|
||||
|
||||
int iXZMode= g_Random.genInteger( 0, 1 );
|
||||
|
||||
const float fMaxSize= 8.0f;
|
||||
float MainSize[2]= {fMaxSize, fMaxSize };
|
||||
|
||||
MainSize[ iXZMode ]-= g_Random.genFloat( 1.5f, 4.0f );
|
||||
MainSize[ 1 - iXZMode ]-= g_Random.genFloat( 0.5f, 1.75f );
|
||||
|
||||
int iRoofType= g_Random.genInteger( -2, 2 );
|
||||
float fRoofParam[ 4 ]=
|
||||
{
|
||||
g_Random.genFloat(),
|
||||
g_Random.genFloat(),
|
||||
g_Random.genFloat(),
|
||||
g_Random.genFloat(),
|
||||
};
|
||||
|
||||
float fInner[ 4 ]=
|
||||
{
|
||||
g_Random.genFloat( 0.125f, 0.5f ),
|
||||
g_Random.genFloat( 0.375f, 0.875f ),
|
||||
g_Random.genFloat( 0.125f, 0.5f ),
|
||||
g_Random.genFloat( 0.375f, 0.875f ),
|
||||
};
|
||||
fInner[ iXZMode * 2 ]*= 0.625f;
|
||||
fInner[ iXZMode * 2 + 1 ]*= 0.625f;
|
||||
|
||||
if( g_Random.genInteger( 0, 4 ) == 4 )
|
||||
{
|
||||
fInner[ 2 - iXZMode * 2 ]*= -1.0f;
|
||||
}
|
||||
|
||||
int iWindowSlices[ 2 ]=
|
||||
{ -1, -1 };
|
||||
|
||||
for( int i= 0; i < 2; ++i )
|
||||
{
|
||||
int iSliceMode= g_Random.genInteger( 0, 6 );
|
||||
if( iSliceMode > 1 )
|
||||
{
|
||||
iWindowSlices[ i ]= (int)MainSize[ i ] - g_Random.genInteger( 0, 3 );
|
||||
}
|
||||
else if( iSliceMode == 1 )
|
||||
{
|
||||
iWindowSlices[ i ]= g_Random.genInteger( 1, 2 );
|
||||
}
|
||||
}
|
||||
|
||||
int iModes[ 20 ]=
|
||||
{
|
||||
0, 0,
|
||||
0, 0,
|
||||
1, 0,
|
||||
0, 1,
|
||||
0, 2,
|
||||
2, 0,
|
||||
2, 2,
|
||||
2, 2,
|
||||
2, 1,
|
||||
1, 2,
|
||||
};
|
||||
int iTowerMode= g_Random.genInteger( 0, 9 ) * 2;
|
||||
|
||||
if( iModes[ iTowerMode ] == 1 || iModes[ iTowerMode + 1 ] == 1 )
|
||||
{
|
||||
if( g_Random.genInteger( 0, 1 ) == 1 )
|
||||
{
|
||||
fInner[ iXZMode * 2 ]*= -1.0f;
|
||||
}
|
||||
|
||||
MainSize[ 1 - iXZMode ]= fMaxSize - g_Random.genFloat( 1.5f, 2.5f );
|
||||
}
|
||||
|
||||
|
||||
for( int i= 0; i < 2; ++i )
|
||||
{
|
||||
int iCurMode= iModes[ iTowerMode + i ];
|
||||
|
||||
if( iCurMode == 1 )
|
||||
{
|
||||
float fSize= g_Random.genFloat( fMaxSize * 0.375f, fMaxSize * 0.625f );
|
||||
float fInner[ 4 ]=
|
||||
{
|
||||
g_Random.genFloat( 0.125f, 0.5f ),
|
||||
g_Random.genFloat( 0.375f, 0.875f ),
|
||||
g_Random.genFloat( 0.125f, 0.5f ),
|
||||
g_Random.genFloat( 0.375f, 0.875f ),
|
||||
};
|
||||
|
||||
int iWindowSlice= (int)fSize - g_Random.genInteger( 0, 2 );
|
||||
|
||||
float fOffset[ 2 ]=
|
||||
{
|
||||
( fMaxSize - fSize ),
|
||||
( fMaxSize - fSize )
|
||||
};
|
||||
|
||||
if( i == 1 )
|
||||
{
|
||||
fOffset[ iXZMode ]*= -1.0f;
|
||||
}
|
||||
|
||||
if( g_Random.genInteger( 0, 1 ) == 1 )
|
||||
{
|
||||
fOffset[ 1 - iXZMode ]*= -1.0f;
|
||||
}
|
||||
|
||||
CreateTower(
|
||||
D3DXVECTOR3( vecPos.x + fOffset[ 0 ] , vecPos.y, vecPos.z + fOffset[ 1 ] ),
|
||||
D3DXVECTOR3( fSize, fHeight * 0.5f, fSize ),
|
||||
D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
|
||||
0xffc0c0c0,
|
||||
fInner[ 0 ], fInner[ 1 ], fInner[ 2 ], fInner[ 3 ],
|
||||
iWindowSlice, iWindowSlice, iStories,
|
||||
g_Random.genFloat( 0.125f, 0.875f ),
|
||||
g_Random.genFloat( 0.125f, 0.875f ),
|
||||
fStoryFrac );
|
||||
|
||||
if( iRoofType == 0 )
|
||||
{
|
||||
CreateRoof(
|
||||
D3DXVECTOR3( vecPos.x + fOffset[ 0 ] , vecPos.y, vecPos.z + fOffset[ 1 ] ),
|
||||
D3DXVECTOR3( fSize, fHeight * 0.5f, fSize ),
|
||||
D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
|
||||
0xffc0c0c0,
|
||||
iRoofType,
|
||||
fRoofParam );
|
||||
}
|
||||
}
|
||||
|
||||
if( iCurMode == 2 )
|
||||
{
|
||||
float fSizeLeft= minimum( fMaxSize - MainSize[ 0 ], fMaxSize - MainSize[ 1 ] );
|
||||
|
||||
float fAngle= 0.0f;
|
||||
|
||||
float fInnerConfigs[ 6 ]=
|
||||
{
|
||||
0.0625f, 0.0625f,
|
||||
g_Random.genFloat( 0.0625f, 0.125f ), g_Random.genFloat( 0.25f, 0.5f ),
|
||||
g_Random.genFloat( -0.125f, -0.25f ), g_Random.genFloat( 0.125f, 0.25f ),
|
||||
};
|
||||
int SliceConfig[ 3 ]=
|
||||
{
|
||||
-1,
|
||||
2,
|
||||
g_Random.genInteger( 1, 3 ),
|
||||
};
|
||||
float fFracConfig[ 3 ]=
|
||||
{
|
||||
0.0f,
|
||||
g_Random.genFloat( 0.125f, 0.25f ),
|
||||
g_Random.genFloat( 0.25f, 0.5f ),
|
||||
};
|
||||
int ConfigX= g_Random.genInteger( 0, 2 );
|
||||
int ConfigZ= g_Random.genInteger( 0, 2 );
|
||||
|
||||
float fOffset[ 2 ]=
|
||||
{
|
||||
MainSize[ 0 ],
|
||||
MainSize[ 1 ],
|
||||
};
|
||||
|
||||
|
||||
if( fSizeLeft > 1.4f )
|
||||
{
|
||||
fAngle= c_PI / 4;
|
||||
|
||||
fSizeLeft/= 1.5f;
|
||||
}
|
||||
else
|
||||
{
|
||||
float fAdd= g_Random.genFloat( 0.125f, 0.75f );
|
||||
fSizeLeft+= fAdd;
|
||||
fOffset[ 0 ]= minimum( fOffset[ 0 ], fMaxSize - fSizeLeft );
|
||||
fOffset[ 1 ]= minimum( fOffset[ 1 ], fMaxSize - fSizeLeft );
|
||||
if( g_Random.genInteger( 0, 1 ) == 1 )
|
||||
{
|
||||
fOffset[ 1 - iXZMode ]*= g_Random.genFloat( 0.0f, 0.6f );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( i == 1 )
|
||||
{
|
||||
fOffset[ iXZMode ]*= -1.0f;
|
||||
}
|
||||
if( g_Random.genInteger( 0, 1 ) == 1 )
|
||||
{
|
||||
fOffset[ 1 - iXZMode ]*= -1.0f;
|
||||
}
|
||||
|
||||
CreateTower(
|
||||
D3DXVECTOR3( vecPos.x + fOffset[ 0 ] , vecPos.y, vecPos.z + fOffset[ 1 ] ),
|
||||
D3DXVECTOR3( fSizeLeft, fHeight * 0.5f, fSizeLeft),
|
||||
D3DXVECTOR3( fAngle, 0.0f, 0.0f ),
|
||||
0xffc0c0c0,
|
||||
fInnerConfigs[ ConfigX * 2 ],fInnerConfigs[ ConfigX * 2 + 1 ],
|
||||
fInnerConfigs[ ConfigZ * 2 ],fInnerConfigs[ ConfigZ * 2 + 1 ],
|
||||
SliceConfig[ ConfigX ], SliceConfig[ ConfigZ ], iStories,
|
||||
fFracConfig[ ConfigX ],
|
||||
fFracConfig[ ConfigZ ],
|
||||
fStoryFrac );
|
||||
}
|
||||
}
|
||||
|
||||
CreateTower(
|
||||
D3DXVECTOR3( vecPos.x , vecPos.y , vecPos.z ),
|
||||
D3DXVECTOR3( MainSize[ 0 ], fHeight * 0.5f, MainSize[ 1 ]),
|
||||
D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
|
||||
0xffc0c0c0,
|
||||
fInner[ 0 ], fInner[ 1 ], fInner[ 2 ], fInner[ 3 ],
|
||||
iWindowSlices[ 0 ], iWindowSlices[ 1 ], iStories,
|
||||
g_Random.genFloat( 0.125f, 0.875f ),
|
||||
g_Random.genFloat( 0.125f, 0.875f ),
|
||||
fStoryFrac );
|
||||
CreateRoof(
|
||||
D3DXVECTOR3( vecPos.x , vecPos.y , vecPos.z ),
|
||||
D3DXVECTOR3( MainSize[ 0 ], fHeight * 0.5f, MainSize[ 1 ]),
|
||||
D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
|
||||
0xffc0c0c0,
|
||||
iRoofType,
|
||||
fRoofParam );
|
||||
}
|
||||
Reference in New Issue
Block a user