LCOV - code coverage report
Current view: top level - usr/include/irrlicht - CMeshBuffer.h (source / functions) Hit Total Coverage
Test: report Lines: 49 78 62.8 %
Date: 2015-07-11 18:23:49 Functions: 37 90 41.1 %

          Line data    Source code
       1             : // Copyright (C) 2002-2012 Nikolaus Gebhardt
       2             : // This file is part of the "Irrlicht Engine".
       3             : // For conditions of distribution and use, see copyright notice in irrlicht.h
       4             : 
       5             : #ifndef __T_MESH_BUFFER_H_INCLUDED__
       6             : #define __T_MESH_BUFFER_H_INCLUDED__
       7             : 
       8             : #include "irrArray.h"
       9             : #include "IMeshBuffer.h"
      10             : 
      11             : namespace irr
      12             : {
      13             : namespace scene
      14             : {
      15             :         //! Template implementation of the IMeshBuffer interface
      16             :         template <class T>
      17     1028620 :         class CMeshBuffer : public IMeshBuffer
      18             :         {
      19             :         public:
      20             :                 //! Default constructor for empty meshbuffer
      21      511927 :                 CMeshBuffer():ChangedID_Vertex(1),ChangedID_Index(1),MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
      22             :                 {
      23             :                         #ifdef _DEBUG
      24             :                         setDebugName("SMeshBuffer");
      25             :                         #endif
      26      511927 :                 }
      27             : 
      28             : 
      29             :                 //! Get material of this meshbuffer
      30             :                 /** \return Material of this buffer */
      31         150 :                 virtual const video::SMaterial& getMaterial() const
      32             :                 {
      33         150 :                         return Material;
      34             :                 }
      35             : 
      36             : 
      37             :                 //! Get material of this meshbuffer
      38             :                 /** \return Material of this buffer */
      39   108940839 :                 virtual video::SMaterial& getMaterial()
      40             :                 {
      41   108940839 :                         return Material;
      42             :                 }
      43             : 
      44             : 
      45             :                 //! Get pointer to vertices
      46             :                 /** \return Pointer to vertices. */
      47     1456168 :                 virtual const void* getVertices() const
      48             :                 {
      49     1456168 :                         return Vertices.const_pointer();
      50             :                 }
      51             : 
      52             : 
      53             :                 //! Get pointer to vertices
      54             :                 /** \return Pointer to vertices. */
      55     1650163 :                 virtual void* getVertices()
      56             :                 {
      57     1650163 :                         return Vertices.pointer();
      58             :                 }
      59             : 
      60             : 
      61             :                 //! Get number of vertices
      62             :                 /** \return Number of vertices. */
      63     6455961 :                 virtual u32 getVertexCount() const
      64             :                 {
      65     6455961 :                         return Vertices.size();
      66             :                 }
      67             : 
      68             :                 //! Get type of index data which is stored in this meshbuffer.
      69             :                 /** \return Index type of this buffer. */
      70     1970865 :                 virtual video::E_INDEX_TYPE getIndexType() const
      71             :                 {
      72     1970865 :                         return video::EIT_16BIT;
      73             :                 }
      74             : 
      75             :                 //! Get pointer to indices
      76             :                 /** \return Pointer to indices. */
      77     1456168 :                 virtual const u16* getIndices() const
      78             :                 {
      79     1456168 :                         return Indices.const_pointer();
      80             :                 }
      81             : 
      82             : 
      83             :                 //! Get pointer to indices
      84             :                 /** \return Pointer to indices. */
      85     1089670 :                 virtual u16* getIndices()
      86             :                 {
      87     1089670 :                         return Indices.pointer();
      88             :                 }
      89             : 
      90             : 
      91             :                 //! Get number of indices
      92             :                 /** \return Number of indices. */
      93     3077844 :                 virtual u32 getIndexCount() const
      94             :                 {
      95     3077844 :                         return Indices.size();
      96             :                 }
      97             : 
      98             : 
      99             :                 //! Get the axis aligned bounding box
     100             :                 /** \return Axis aligned bounding box of this buffer. */
     101      537240 :                 virtual const core::aabbox3d<f32>& getBoundingBox() const
     102             :                 {
     103      537240 :                         return BoundingBox;
     104             :                 }
     105             : 
     106             : 
     107             :                 //! Set the axis aligned bounding box
     108             :                 /** \param box New axis aligned bounding box for this buffer. */
     109             :                 //! set user axis aligned bounding box
     110           0 :                 virtual void setBoundingBox(const core::aabbox3df& box)
     111             :                 {
     112           0 :                         BoundingBox = box;
     113           0 :                 }
     114             : 
     115             : 
     116             :                 //! Recalculate the bounding box.
     117             :                 /** should be called if the mesh changed. */
     118      537240 :                 virtual void recalculateBoundingBox()
     119             :                 {
     120      537240 :                         if (Vertices.empty())
     121           0 :                                 BoundingBox.reset(0,0,0);
     122             :                         else
     123             :                         {
     124      537240 :                                 BoundingBox.reset(Vertices[0].Pos);
     125    15145447 :                                 for (u32 i=1; i<Vertices.size(); ++i)
     126    14608207 :                                         BoundingBox.addInternalPoint(Vertices[i].Pos);
     127             :                         }
     128      537240 :                 }
     129             : 
     130             : 
     131             :                 //! Get type of vertex data stored in this buffer.
     132             :                 /** \return Type of vertex data. */
     133     1571172 :                 virtual video::E_VERTEX_TYPE getVertexType() const
     134             :                 {
     135     1571172 :                         return T().getType();
     136             :                 }
     137             : 
     138             :                 //! returns position of vertex i
     139           0 :                 virtual const core::vector3df& getPosition(u32 i) const
     140             :                 {
     141           0 :                         return Vertices[i].Pos;
     142             :                 }
     143             : 
     144             :                 //! returns position of vertex i
     145    16193319 :                 virtual core::vector3df& getPosition(u32 i)
     146             :                 {
     147    16193319 :                         return Vertices[i].Pos;
     148             :                 }
     149             : 
     150             :                 //! returns normal of vertex i
     151           0 :                 virtual const core::vector3df& getNormal(u32 i) const
     152             :                 {
     153           0 :                         return Vertices[i].Normal;
     154             :                 }
     155             : 
     156             :                 //! returns normal of vertex i
     157    31021807 :                 virtual core::vector3df& getNormal(u32 i)
     158             :                 {
     159    31021807 :                         return Vertices[i].Normal;
     160             :                 }
     161             : 
     162             :                 //! returns texture coord of vertex i
     163           0 :                 virtual const core::vector2df& getTCoords(u32 i) const
     164             :                 {
     165           0 :                         return Vertices[i].TCoords;
     166             :                 }
     167             : 
     168             :                 //! returns texture coord of vertex i
     169           0 :                 virtual core::vector2df& getTCoords(u32 i)
     170             :                 {
     171           0 :                         return Vertices[i].TCoords;
     172             :                 }
     173             : 
     174             : 
     175             :                 //! Append the vertices and indices to the current buffer
     176             :                 /** Only works for compatible types, i.e. either the same type
     177             :                 or the main buffer is of standard type. Otherwise, behavior is
     178             :                 undefined.
     179             :                 */
     180      529672 :                 virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices)
     181             :                 {
     182      529672 :                         if (vertices == getVertices())
     183           0 :                                 return;
     184             : 
     185      529672 :                         const u32 vertexCount = getVertexCount();
     186             :                         u32 i;
     187             : 
     188      529672 :                         Vertices.reallocate(vertexCount+numVertices);
     189    14964683 :                         for (i=0; i<numVertices; ++i)
     190             :                         {
     191    14435011 :                                 Vertices.push_back(reinterpret_cast<const T*>(vertices)[i]);
     192    14435011 :                                 BoundingBox.addInternalPoint(reinterpret_cast<const T*>(vertices)[i].Pos);
     193             :                         }
     194             : 
     195      529672 :                         Indices.reallocate(getIndexCount()+numIndices);
     196    28069126 :                         for (i=0; i<numIndices; ++i)
     197             :                         {
     198    27539454 :                                 Indices.push_back(indices[i]+vertexCount);
     199             :                         }
     200             :                 }
     201             : 
     202             : 
     203             :                 //! Append the meshbuffer to the current buffer
     204             :                 /** Only works for compatible types, i.e. either the same type
     205             :                 or the main buffer is of standard type. Otherwise, behavior is
     206             :                 undefined.
     207             :                 \param other Meshbuffer to be appended to this one.
     208             :                 */
     209           0 :                 virtual void append(const IMeshBuffer* const other)
     210             :                 {
     211             :                         /*
     212             :                         if (this==other)
     213             :                                 return;
     214             : 
     215             :                         const u32 vertexCount = getVertexCount();
     216             :                         u32 i;
     217             : 
     218             :                         Vertices.reallocate(vertexCount+other->getVertexCount());
     219             :                         for (i=0; i<other->getVertexCount(); ++i)
     220             :                         {
     221             :                                 Vertices.push_back(reinterpret_cast<const T*>(other->getVertices())[i]);
     222             :                         }
     223             : 
     224             :                         Indices.reallocate(getIndexCount()+other->getIndexCount());
     225             :                         for (i=0; i<other->getIndexCount(); ++i)
     226             :                         {
     227             :                                 Indices.push_back(other->getIndices()[i]+vertexCount);
     228             :                         }
     229             :                         BoundingBox.addInternalBox(other->getBoundingBox());
     230             :                         */
     231           0 :                 }
     232             : 
     233             : 
     234             :                 //! get the current hardware mapping hint
     235     1456018 :                 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
     236             :                 {
     237     1456018 :                         return MappingHint_Vertex;
     238             :                 }
     239             : 
     240             :                 //! get the current hardware mapping hint
     241     1456018 :                 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
     242             :                 {
     243     1456018 :                         return MappingHint_Index;
     244             :                 }
     245             : 
     246             :                 //! set the hardware mapping hint, for driver
     247           0 :                 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX )
     248             :                 {
     249           0 :                         if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
     250           0 :                                 MappingHint_Vertex=NewMappingHint;
     251           0 :                         if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
     252           0 :                                 MappingHint_Index=NewMappingHint;
     253           0 :                 }
     254             : 
     255             : 
     256             :                 //! flags the mesh as changed, reloads hardware buffers
     257           0 :                 virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
     258             :                 {
     259           0 :                         if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
     260           0 :                                 ++ChangedID_Vertex;
     261           0 :                         if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
     262           0 :                                 ++ChangedID_Index;
     263           0 :                 }
     264             : 
     265             :                 //! Get the currently used ID for identification of changes.
     266             :                 /** This shouldn't be used for anything outside the VideoDriver. */
     267           0 :                 virtual u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
     268             : 
     269             :                 //! Get the currently used ID for identification of changes.
     270             :                 /** This shouldn't be used for anything outside the VideoDriver. */
     271           0 :                 virtual u32 getChangedID_Index() const {return ChangedID_Index;}
     272             : 
     273             :                 u32 ChangedID_Vertex;
     274             :                 u32 ChangedID_Index;
     275             : 
     276             :                 //! hardware mapping hint
     277             :                 E_HARDWARE_MAPPING MappingHint_Vertex;
     278             :                 E_HARDWARE_MAPPING MappingHint_Index;
     279             : 
     280             :                 //! Material for this meshbuffer.
     281             :                 video::SMaterial Material;
     282             :                 //! Vertices of this buffer
     283             :                 core::array<T> Vertices;
     284             :                 //! Indices into the vertices of this buffer.
     285             :                 core::array<u16> Indices;
     286             :                 //! Bounding box of this meshbuffer.
     287             :                 core::aabbox3d<f32> BoundingBox;
     288             :         };
     289             : 
     290             :         //! Standard meshbuffer
     291             :         typedef CMeshBuffer<video::S3DVertex> SMeshBuffer;
     292             :         //! Meshbuffer with two texture coords per vertex, e.g. for lightmaps
     293             :         typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
     294             :         //! Meshbuffer with vertices having tangents stored, e.g. for normal mapping
     295             :         typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
     296             : } // end namespace scene
     297             : } // end namespace irr
     298             : 
     299             : #endif
     300             : 
     301             : 

Generated by: LCOV version 1.11