bjone Insert booze to continue | le code que j'utilises:
Code :
- bool PlanetRenderer::GeneratePlanet( int Slices, int Stacks )
- {
- int MaxStacks=Stacks+1;
- int MaxSlices=Slices+1;
- PlanetGenerated=false;
- // Scope VertexBuffer
- {
- PVertex *Vtx;
- VertexBuffer::Locker Lck;
- // Création et Lock
- if( !PlanetVB.Create( MaxStacks*MaxSlices, sizeof(PVertex), D3DFVF_NORMAL ) || !Lck.Lock(PlanetVB,Vtx) )
- return false;
- float dDir=D3DX_PI*2/Slices;
- float dElev=D3DX_PI/Stacks;
- float dU=1.0f/Slices;
- float dV=1.0f/Stacks;
- float Elev=D3DX_PI/2;
- float V=0;
- // du haut vers le bas
- for( int i=0 ; i < MaxStacks ; i++, Elev-=dElev, V+=dV )
- {
- float Dir=0, U=1;
- float S_Elev=sin(Elev);
- float Ray=cos(Elev);
- //DebugPrintf("%d Elev: %f, S: %f C: %f",i,Elev,S_Elev,Ray);
- // dans le plan x/z, => de la droite vers la gauche au niveau de la texture
- for( int j=0 ; j < MaxSlices ; j++, Dir+=dDir, Vtx++, U-=dU )
- {
- Vtx->Normal[0]=cos(Dir)*Ray; // X
- Vtx->Normal[1]=S_Elev; // Y
- Vtx->Normal[2]=sin(Dir)*Ray; // Z
- Vtx->Tangent[0]=-cos(Dir+D3DX_PI/2);
- Vtx->Tangent[1]=0;
- Vtx->Tangent[2]=-sin(Dir+D3DX_PI/2);
- D3DXVec3Cross( (D3DXVECTOR3*) Vtx->BiNormal, (D3DXVECTOR3*) Vtx->Normal, (D3DXVECTOR3*) Vtx->Tangent );
- Vtx->Tex[0]=U;
- Vtx->Tex[1]=V;
- }
- }
- }
- // Scope IndexBuffer
- {
- WORD *Idx;
- IndexBuffer::Locker Lck;
- if( !PlanetIB.Create( MaxSlices*Stacks*6 ) || !Lck.Lock(PlanetIB,Idx) )
- return false;
- for( int i=0 ; i < Stacks ; i++ )
- {
- int Top=i*MaxSlices;
- int Bottom=Top+MaxSlices;
- for( int j=0 ; j < Slices ; j++ )
- {
- int T=Top+j;
- int B=Bottom+j;
- *Idx++=T; *Idx++=B; *Idx++=T+1;
- *Idx++=T+1; *Idx++=B; *Idx++=B+1;
- }
- }
- }
- return PlanetGenerated=true;
- }
|
|