CrystalSpace

Public API Reference

csgfx/trianglestream.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2006 by Jorrit Tyberghein
00003               (C) 2006 by Frank Richter
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 */
00019 
00020 #ifndef __CS_TRIANGLESTREAM_H__
00021 #define __CS_TRIANGLESTREAM_H__
00022 
00026 #include "ivideo/graph3d.h"
00027 #include "ivideo/rndbuf.h"
00028 
00029 namespace CS
00030 {
00031   
00036   template<typename T>
00037   class TriangleIndicesStream
00038   {
00039     size_t stride;
00040     const uint8* index;
00041     const uint8* indexEnd;
00042     T old2, old1;
00043     bool stripFlag;
00044     int quadPart;
00045 
00046     csRenderBufferComponentType compType;
00047     csRenderMeshType meshtype;
00048 
00050     T GetNextIndex()
00051     {
00052       T r;
00053       switch (compType)
00054       {
00055         default:
00056           CS_ASSERT(false);
00057         case CS_BUFCOMP_BYTE:
00058           r = *(char*)index;
00059           break;
00060         case CS_BUFCOMP_UNSIGNED_BYTE:
00061           r = *(unsigned char*)index;
00062           break;
00063         case CS_BUFCOMP_SHORT:
00064           r = *(short*)index;
00065           break;
00066         case CS_BUFCOMP_UNSIGNED_SHORT:
00067           r = *(unsigned short*)index;
00068           break;
00069         case CS_BUFCOMP_INT:
00070           r = *(int*)index;
00071           break;
00072         case CS_BUFCOMP_UNSIGNED_INT:
00073           r = *(unsigned int*)index;
00074           break;
00075         case CS_BUFCOMP_FLOAT:
00076           r = uint (*(float*)index);
00077           break;
00078         case CS_BUFCOMP_DOUBLE:
00079           r = uint (*(double*)index);
00080           break;
00081       }
00082       index += stride;
00083       return r;
00084     }
00085     T GetIndex (size_t idx)
00086     {
00087       switch (compType)
00088       {
00089         default:
00090           CS_ASSERT(false);
00091         case CS_BUFCOMP_BYTE:
00092           return T (*(char*)(index+idx*stride));
00093         case CS_BUFCOMP_UNSIGNED_BYTE:
00094           return T (*(unsigned char*)(index+idx*stride));
00095         case CS_BUFCOMP_SHORT:
00096           return T (*(short*)(index+idx*stride));
00097         case CS_BUFCOMP_UNSIGNED_SHORT:
00098           return T (*(unsigned short*)(index+idx*stride));
00099         case CS_BUFCOMP_INT:
00100           return T (*(int*)(index+idx*stride));
00101         case CS_BUFCOMP_UNSIGNED_INT:
00102           return T (*(unsigned int*)(index+idx*stride));
00103         case CS_BUFCOMP_FLOAT:
00104           return T (*(float*)(index+idx*stride));
00105         case CS_BUFCOMP_DOUBLE:
00106           return T (*(double*)(index+idx*stride));
00107       }
00108       return 0;
00109     }
00110   public:
00111     TriangleIndicesStream ()
00112     {
00113     }
00114 
00122     void BeginTriangulate (const uint8* index, const uint8* indexEnd,
00123       size_t stride, csRenderBufferComponentType compType,
00124       csRenderMeshType meshtype)
00125     {
00126       this->index = index;
00127       this->indexEnd = indexEnd;
00128       this->stride = stride;
00129       stripFlag = false;
00130       quadPart = 0;
00131       this->compType = compType;
00132       this->meshtype = meshtype;
00133 
00134       switch (meshtype)
00135       {
00136       case CS_MESHTYPE_TRIANGLESTRIP:
00137       case CS_MESHTYPE_TRIANGLEFAN:
00138         {
00139           old2 = GetNextIndex();
00140           old1 = GetNextIndex();
00141           break;
00142         }
00143       default:
00144         ;
00145       }
00146     }
00147 
00149     bool HasNextTri() const
00150     {
00151       return (index < indexEnd);
00152     }
00154     bool NextTriangle (T& a, T& b, T& c)
00155     {
00156       if (index < indexEnd)
00157       {
00158         switch (meshtype)
00159         {
00160         case CS_MESHTYPE_TRIANGLES:
00161           {
00162             a = GetIndex (0);
00163             b = GetIndex (1);
00164             c = GetIndex (2);
00165             index += 3*csRenderBufferComponentSizes[compType];
00166             return true;
00167           }
00168           break;
00169         case CS_MESHTYPE_TRIANGLESTRIP:
00170           {
00171             const T cur = GetNextIndex();
00172             a = old1;
00173             b = old2;
00174             c = cur;
00175             if (stripFlag)
00176               old2 = cur;
00177             else
00178               old1 = cur;
00179             stripFlag = !stripFlag;
00180             return true;
00181           }
00182           break;
00183         case CS_MESHTYPE_TRIANGLEFAN:
00184           {
00185             const T cur = GetNextIndex();
00186             a = old2;
00187             b = old1;
00188             c = cur;
00189             old1 = cur;
00190             return true;
00191           }
00192           break;
00193         case CS_MESHTYPE_QUADS:
00194           {
00195             if (quadPart == 0)
00196             {
00197               a = GetIndex (0);
00198               b = GetIndex (1);
00199               c = GetIndex (2);
00200             }
00201             else
00202             {
00203               a = GetIndex (0);
00204               b = GetIndex (2);
00205               c = GetIndex (3);
00206               index += 4*csRenderBufferComponentSizes[compType];
00207             }
00208             quadPart ^= 1;
00209             return true;
00210           }
00211           break;
00212         default:
00213           ;
00214         }
00215       }
00216       return false;
00217     }
00218   };
00219   
00220 } // namespace CS
00221 
00222 #endif // __CS_TRIANGLESTREAM_H__

Generated for Crystal Space by doxygen 1.4.7