D:/Zythum/DinoKod/Landscape/SkyDraw.cpp

00001 //---------------------------------------------------------------------------------------------
00002 //      This file is a part of "DinoKod".
00003 //      Copyright © 2003 Dino Productions. All Rights Reserved.
00004 //      
00005 //      File                    : SkyDraw.cpp
00006 //      Author                  : Sebastien LEIX        sebastien.leix@wanadoo.fr
00007 //      Date                    : 31/01/2003
00008 //      Modification    :
00009 //
00010 //---------------------------------------------------------------------------------------------
00011 #include "Render/Render.h"
00012 #include "Render/Camera.h"
00013 #include "Landscape/SunDraw.h"
00014 #include "Landscape/SkyDraw.h"
00015 
00016 //---------------------------------------------------------------------------------------------
00017 KSkyDraw::KSkyDraw()
00018 {
00019         m_pRender               = NULL;
00020         m_pSunDraw              = NULL;
00021 
00022         m_pVertex               = NULL;
00023         m_nVertex               = 0;
00024         m_pIndex                = NULL;
00025         m_nIndex                = 0;
00026 }
00027 
00028 //---------------------------------------------------------------------------------------------
00029 KSkyDraw::~KSkyDraw()
00030 {
00031         if( m_pVertex )
00032                 Deletev( m_pVertex );
00033                 
00034         if( m_pIndex )
00035                 Deletev( m_pIndex );
00036 }
00037 
00038 //---------------------------------------------------------------------------------------------
00039 bool KSkyDraw::Init( KRender* pRender, u32 nSegments, KSunDraw* pSunDraw )
00040 {
00041         KASSERT( !m_pRender );
00042 
00043         m_pRender       = pRender;
00044         m_nSegments = nSegments;
00045         m_pSunDraw      = pSunDraw;
00046 
00047         u32     x, y;
00048         u32 nSegmentX = nSegments + 1;
00049         u32 nSegmentY = nSegments + 1;
00050 
00051         //
00052         //      Vertex
00053         //
00054         m_nVertex       = (m_nSegments + 1) * (m_nSegments + 1);
00055         m_pVertex       = new KLVertex[ m_nVertex ];
00056 
00057         u32             v = 0;
00058         float   AngleX;
00059         float   AngleY;
00060         float   BaseRadiusX = pRender->GetCamera()->GetFarPlane() * 0.95f;
00061         float   BaseRadiusY = BaseRadiusX / 2.0f;
00062         float   RadiusX;
00063 
00064         // Hemisphere
00065         for( y = 0; y < nSegmentY - 1; y ++ )
00066         {
00067                 AngleY = ((PI / 2) / (float)(m_nSegments)) * (float)y;
00068 
00069                 RadiusX = BaseRadiusX * cosf( AngleY );
00070 
00071                 for( x = 0; x < nSegmentX; x ++ )
00072                 {
00073                         AngleX = ((2 * PI) / (float)m_nSegments) * (float)x;
00074                         
00075                         m_pVertex[v].Position   = KVector( RadiusX * cosf( AngleX ), RadiusX * sinf( AngleX ), BaseRadiusY * sinf( AngleY ) );
00076                         m_pVertex[v].Color              = KRGB( 255, 255, 255 );//KRGB( 10, 255, 25 );
00077                         m_pVertex[v].Specular   = KRGB( 0, 0, 0 );
00078                         m_pVertex[v].tu                 = (1.0f / (float)(nSegmentX - 1)) * (float)x;
00079                         m_pVertex[v].tv                 = 1.0f - (1.0f / (float)(nSegmentY - 1)) * (float)y;
00080                         v ++;
00081                 }
00082         }
00083 
00084         // Couvercle
00085         for( x = 0; x < nSegmentX; x ++ )
00086         {
00087                 m_pVertex[v].Position   = KVector( 0.0f, 0.0f, BaseRadiusY );
00088                 m_pVertex[v].Color              = KRGB( 255, 255, 255 );//KRGB( 10, 255, 25 );
00089                 m_pVertex[v].Specular   = KRGB( 0, 0, 0 );
00090                 m_pVertex[v].tu                 = (1.0f / (float)(nSegmentX - 1)) * (float)(x + 0.5f);
00091                 m_pVertex[v].tv                 = 0.0f;
00092                 v ++;
00093         }
00094 
00095         KASSERT( v == m_nVertex );
00096 
00097         //
00098         //      Index
00099         //
00100         u32     i = 0;
00101 
00102         m_nIndex        = m_nSegments * (m_nSegments - 1) * 6 + m_nSegments * 3;
00103         m_pIndex        = new KINDEX[ m_nIndex ];
00104 
00105         // Hemisphere
00106         for( y = 0; y < m_nSegments - 1; y ++ )
00107         {
00108                 for( x = 0; x < m_nSegments; x ++ )
00109                 {
00110                         // Triangles 1
00111                         m_pIndex[i + 0] = (KINDEX)((y * nSegmentX) + x );
00112                         m_pIndex[i + 1] = (KINDEX)((y * nSegmentX) + x + 1);
00113                         m_pIndex[i + 2] = (KINDEX)(((y + 1) * nSegmentX) + x);
00114 
00115                         // Triangles 2
00116                         m_pIndex[i + 3] = (KINDEX)((y * nSegmentX) + x + 1);
00117                         m_pIndex[i + 4] = (KINDEX)(((y + 1) * nSegmentX) + x + 1);
00118                         m_pIndex[i + 5] = (KINDEX)(((y + 1) * nSegmentX) + x);
00119 
00120                         i += 6;
00121                 }
00122         }
00123 
00124         // Couvercle du trou en haut
00125         for( x = 0; x < m_nSegments; x ++ )
00126         {
00127                 // Triangles 1
00128                 m_pIndex[i + 0] = (KINDEX)(((m_nSegments - 1)* nSegmentX) + x );
00129                 m_pIndex[i + 1] = (KINDEX)(((m_nSegments - 1 )* nSegmentX) + x + 1);
00130                 m_pIndex[i + 2] = (KINDEX)(((m_nSegments) * nSegmentX) + x);
00131 
00132                 i += 3;
00133         }
00134 
00135         KASSERT( i == m_nIndex );
00136 
00137         //
00138         //      Shader
00139         //
00140         m_hShader = m_pRender->GetpShaderBank()->LoadShader( "Sky/Sky" );
00141 
00142         return true;
00143 }
00144 
00145 //---------------------------------------------------------------------------------------------
00146 void KSkyDraw::Draw()
00147 {
00148         KVector                 CamPos = m_pRender->GetCamera()->GetPos();
00149         KMatrix                 Matrix;
00150         KMatrix                 CurrentMatrix;
00151         KRenderFace             RenderFace;
00152 
00153         // Sauvegarde la matrice courante
00154         CurrentMatrix = m_pRender->GetWorldMatrix();
00155         
00156         // Eclaire le ciel
00157         if( m_pSunDraw )
00158         {
00159                 KRgb    Diffuse;
00160                 KRgb    Specular;
00161 
00162                 Diffuse.r       = (u8)MIN( 255.0f, m_pSunDraw->GetAmbient().r * 4.0f * 255.0f );
00163                 Diffuse.g       = (u8)MIN( 255.0f, m_pSunDraw->GetAmbient().g * 4.0f * 255.0f );
00164                 Diffuse.b       = (u8)MIN( 255.0f, m_pSunDraw->GetAmbient().b * 4.0f * 255.0f );
00165                 Specular.r      = (u8)MIN( 100.0f, m_pSunDraw->GetSpecular().r * 300.0f );
00166                 Specular.g      = (u8)MIN( 100.0f, m_pSunDraw->GetSpecular().g * 300.0f );
00167                 Specular.b      = (u8)MIN( 100.0f, m_pSunDraw->GetSpecular().b * 300.0f );
00168 
00169                 for( u32 v = 0; v < m_nVertex; v ++ )
00170                 {
00171                         m_pVertex[v].Color              = Diffuse.GetColor();
00172                         m_pVertex[v].Specular   = Specular.GetColor();
00173                 }
00174         }
00175 
00176         float h = CamPos.z + m_pRender->GetCamera()->GetFarPlane() / 2.0f;
00177         float s = h / (m_pRender->GetCamera()->GetFarPlane() / 2.0f);
00178 
00179         Matrix.LoadIdentity();
00180         Matrix.Trans( CamPos.x, CamPos.y, 0.0f/*CamPos.z*/ );
00181         Matrix.Scale( 1.0f, 1.0f, s );
00182         m_pRender->SetWorldMatrix( Matrix );
00183 
00184 //      m_pRender->SetWireFrame( true );
00185 
00186         m_pRender->SetShader( m_hShader );
00187         RenderFace.m_VertexType = KRLVERTEX;
00188         RenderFace.m_nVertex    = (u16)m_nVertex;
00189         RenderFace.m_pVertex    = m_pVertex;
00190         RenderFace.m_nIndices   = (u16)m_nIndex;
00191         RenderFace.m_pIndices   = m_pIndex;
00192         m_pRender->DrawTriangles( RenderFace );
00193         m_pRender->FlushTriangles();
00194 
00195 //      m_pRender->SetWireFrame( false );
00196 
00197         // Restore la matrice courante
00198         m_pRender->SetWorldMatrix( CurrentMatrix );
00199 }
00200 

Generated on Sun Mar 25 20:02:12 2007 for Zythum Project by  doxygen 1.5.1-p1