KeosMeshGen.cpp

Go to the documentation of this file.
00001 /*
00002  * This source file is part of KEOS (Free 3D Engine)
00003  * For the latest info, see http://www.keosengine.org/
00004  * E-mails : thierry.vouriot@keosengine.org, yeri@keosengine.org
00005  *
00006  * This program is free software; you can redistribute it and/or modify it under
00007  * the terms of the GNU Lesser General Public License as published by the Free Software
00008  * Foundation; either version 2 of the License, or (at your option) any later
00009  * version.
00010  *
00011  * This program is distributed in the hope that it will be useful, but WITHOUT
00012  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public License along with
00016  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00017  * Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00018  * http://www.gnu.org/copyleft/lesser.txt.
00019  *
00020  */
00021 
00022 #include "KeosMeshGen.h"
00023 #include "KeosMesh.h"
00024 #include "KeosRoot.h"
00025 #include "KeosRenderSystem.h"
00026 #include "KeosMath.h"
00027 
00028 namespace Keos
00029 {
00030   //=======================================================================
00031   // CMeshGen implementation
00032   //=======================================================================
00033 
00034   //-----------------------------------------------------------------------
00035   CMesh* CMeshGen::MakeCube(float fSize, const CColor& Color)
00036   {
00037     CMeshGeom::TVertex Vertices[] =
00038       {
00039         {TVector3F(-fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00040         {TVector3F( fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00041         {TVector3F(-fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00042         {TVector3F( fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) },
00043 
00044         {TVector3F(-fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00045         {TVector3F(-fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) },
00046         {TVector3F( fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00047         {TVector3F( fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00048 
00049         {TVector3F(-fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00050         {TVector3F( fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00051         {TVector3F(-fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00052         {TVector3F( fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) },
00053 
00054         {TVector3F(-fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00055         {TVector3F(-fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00056         {TVector3F( fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) },
00057         {TVector3F( fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00058 
00059         {TVector3F( fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00060         {TVector3F( fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) },
00061         {TVector3F( fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00062         {TVector3F( fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00063 
00064         {TVector3F(-fSize, fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 0.0f) },
00065         {TVector3F(-fSize, -fSize, -fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 0.0f) },
00066         {TVector3F(-fSize, fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(0.0f, 1.0f) },
00067         {TVector3F(-fSize, -fSize, fSize), TVector3F(0, 0, 0), CRoot::Instance().GetRenderSystem()->ConvertColor(Color), TVector2F(1.0f, 1.0f) }
00068       };
00069 
00070     CMeshGeom::TIndex Indices[] = {  0,  1,  2,  3,  2,  1,
00071                                      4,  5,  6,  7,  6,  5,
00072                                      8,  9, 10, 11, 10,  9,
00073                                      12, 13, 14, 15, 14, 13,
00074                                      16, 17, 18, 19, 18, 17,
00075                                      20, 21, 22, 23, 22, 21 };
00076 
00077     CMesh* pMesh = new CMesh();
00078 
00079     CMeshGeom *pMeshGeom = new CMeshGeom(&Vertices[0], 24, &Indices[0], 36);
00080     pMesh->AddMeshGeom(pMeshGeom);
00081 
00082     // Add the material to the mesh
00083     pMesh->AddMaterial(new CMaterial(), 0);
00084 
00085     pMesh->ComputeNormals();
00086 
00087     return pMesh;
00088   }
00089 
00090   //-----------------------------------------------------------------------
00091   CMesh* CMeshGen::MakeSphere(float fRadius, int nRings, int nSegments, const CColor& Color)
00092   {
00093     std::vector<CMeshGeom::TVertex> Vertices;
00094     std::vector<CMeshGeom::TIndex>  Indices;
00095 
00096     // Allocate memory for the mesh
00097     ulong nVertices = (nRings + 1) * (nSegments + 1);
00098     ulong nIndices = 2 * nRings * (nSegments + 1);
00099     Vertices.resize(nVertices);
00100     Indices.resize(nIndices);
00101 
00102     float fDeltaRingAngle = CMath::PI / nRings;
00103     float fDeltaSegAngle = (CMath::TWO_PI / nSegments);
00104 
00105     ulong nVertexIndex = 0;
00106 
00107     ulong i = 0;
00108     ulong j = 0;
00109 
00110     for (int ring = 0; ring < nRings + 1; ring++)
00111     {
00112       float r = sinf(ring * fDeltaRingAngle);
00113       float y = cosf(ring * fDeltaRingAngle);
00114 
00115       for (int seg = 0; seg < nSegments + 1; seg++)
00116       {
00117         float x = r * sinf(seg * fDeltaSegAngle);
00118         float z = r * cosf(seg * fDeltaSegAngle);
00119 
00120         Vertices[i].Position = TVector3F(x, y, z) * fRadius;
00121         Vertices[i].Normal = TVector3F(x, y, z);
00122         Vertices[i].Color = CRoot::Instance().GetRenderSystem()->ConvertColor(Color);
00123 
00124         Vertices[i].TexCoords = TVector2F(-(float)seg / (float)nSegments,
00125                                           (float)ring / (float)nRings);
00126         i++;
00127         if (ring != nRings)
00128         {
00129           Indices[j++] = nVertexIndex;
00130 
00131           Indices[j++] = nVertexIndex + (ulong)(nSegments + 1);
00132 
00133           nVertexIndex++;
00134         }
00135       }
00136     }
00137 
00138     CMesh* pMesh = new CMesh();
00139     CMeshGeom *pMeshGeom = new CMeshGeom( &Vertices[0], (int)Vertices.size(),
00140                                           &Indices[0], (int)Indices.size(),
00141                                           PT_TRIANGLESTRIP);
00142     pMesh->AddMeshGeom(pMeshGeom);
00143 
00144     // Add the material to the mesh
00145     pMesh->AddMaterial(new CMaterial(), 0);
00146 
00147     //this->ComputeNormals();
00148     return pMesh;
00149   }
00150 
00151 } // namespace Keos

Generated on Fri Mar 9 14:29:02 2007 for Keos by  doxygen 1.5.1-p1