00001
00002
00003
00004
00005
00006
00007
00008
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
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
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 );
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
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 );
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
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
00106 for( y = 0; y < m_nSegments - 1; y ++ )
00107 {
00108 for( x = 0; x < m_nSegments; x ++ )
00109 {
00110
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
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
00125 for( x = 0; x < m_nSegments; x ++ )
00126 {
00127
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
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
00154 CurrentMatrix = m_pRender->GetWorldMatrix();
00155
00156
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 );
00181 Matrix.Scale( 1.0f, 1.0f, s );
00182 m_pRender->SetWorldMatrix( Matrix );
00183
00184
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
00196
00197
00198 m_pRender->SetWorldMatrix( CurrentMatrix );
00199 }
00200