LCOV - code coverage report
Current view: top level - usr/include/irrlicht - SAnimatedMesh.h (source / functions) Hit Total Coverage
Test: report Lines: 30 63 47.6 %
Date: 2015-07-11 18:23:49 Functions: 9 18 50.0 %

          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 __S_ANIMATED_MESH_H_INCLUDED__
       6             : #define __S_ANIMATED_MESH_H_INCLUDED__
       7             : 
       8             : #include "IAnimatedMesh.h"
       9             : #include "IMesh.h"
      10             : #include "aabbox3d.h"
      11             : #include "irrArray.h"
      12             : 
      13             : namespace irr
      14             : {
      15             : namespace scene
      16             : {
      17             : 
      18             :         //! Simple implementation of the IAnimatedMesh interface.
      19             :         struct SAnimatedMesh : public IAnimatedMesh
      20             :         {
      21             :                 //! constructor
      22           1 :                 SAnimatedMesh(scene::IMesh* mesh=0, scene::E_ANIMATED_MESH_TYPE type=scene::EAMT_UNKNOWN) : IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
      23             :                 {
      24             :                         #ifdef _DEBUG
      25             :                         setDebugName("SAnimatedMesh");
      26             :                         #endif
      27           1 :                         addMesh(mesh);
      28           1 :                         recalculateBoundingBox();
      29           1 :                 }
      30             : 
      31             :                 //! destructor
      32        2808 :                 virtual ~SAnimatedMesh()
      33        2808 :                 {
      34             :                         // drop meshes
      35        2808 :                         for (u32 i=0; i<Meshes.size(); ++i)
      36        1404 :                                 Meshes[i]->drop();
      37        2808 :                 }
      38             : 
      39             :                 //! Gets the frame count of the animated mesh.
      40             :                 /** \return Amount of frames. If the amount is 1, it is a static, non animated mesh. */
      41           0 :                 virtual u32 getFrameCount() const
      42             :                 {
      43           0 :                         return Meshes.size();
      44             :                 }
      45             : 
      46             :                 //! Gets the default animation speed of the animated mesh.
      47             :                 /** \return Amount of frames per second. If the amount is 0, it is a static, non animated mesh. */
      48           0 :                 virtual f32 getAnimationSpeed() const
      49             :                 {
      50           0 :                         return FramesPerSecond;
      51             :                 }
      52             : 
      53             :                 //! Gets the frame count of the animated mesh.
      54             :                 /** \param fps Frames per second to play the animation with. If the amount is 0, it is not animated.
      55             :                 The actual speed is set in the scene node the mesh is instantiated in.*/
      56           0 :                 virtual void setAnimationSpeed(f32 fps)
      57             :                 {
      58           0 :                         FramesPerSecond=fps;
      59           0 :                 }
      60             : 
      61             :                 //! Returns the IMesh interface for a frame.
      62             :                 /** \param frame: Frame number as zero based index. The maximum frame number is
      63             :                 getFrameCount() - 1;
      64             :                 \param detailLevel: Level of detail. 0 is the lowest,
      65             :                 255 the highest level of detail. Most meshes will ignore the detail level.
      66             :                 \param startFrameLoop: start frame
      67             :                 \param endFrameLoop: end frame
      68             :                 \return The animated mesh based on a detail level. */
      69           0 :                 virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1)
      70             :                 {
      71           0 :                         if (Meshes.empty())
      72           0 :                                 return 0;
      73             : 
      74           0 :                         return Meshes[frame];
      75             :                 }
      76             : 
      77             :                 //! adds a Mesh
      78           1 :                 void addMesh(IMesh* mesh)
      79             :                 {
      80           1 :                         if (mesh)
      81             :                         {
      82           1 :                                 mesh->grab();
      83           1 :                                 Meshes.push_back(mesh);
      84             :                         }
      85           1 :                 }
      86             : 
      87             :                 //! Returns an axis aligned bounding box of the mesh.
      88             :                 /** \return A bounding box of this mesh is returned. */
      89        1255 :                 virtual const core::aabbox3d<f32>& getBoundingBox() const
      90             :                 {
      91        1255 :                         return Box;
      92             :                 }
      93             : 
      94             :                 //! set user axis aligned bounding box
      95        2821 :                 virtual void setBoundingBox(const core::aabbox3df& box)
      96             :                 {
      97        2821 :                         Box = box;
      98        2821 :                 }
      99             : 
     100             :                 //! Recalculates the bounding box.
     101           1 :                 void recalculateBoundingBox()
     102             :                 {
     103           1 :                         Box.reset(0,0,0);
     104             : 
     105           1 :                         if (Meshes.empty())
     106           0 :                                 return;
     107             : 
     108           1 :                         Box = Meshes[0]->getBoundingBox();
     109             : 
     110           1 :                         for (u32 i=1; i<Meshes.size(); ++i)
     111           0 :                                 Box.addInternalBox(Meshes[i]->getBoundingBox());
     112             :                 }
     113             : 
     114             :                 //! Returns the type of the animated mesh.
     115           0 :                 virtual E_ANIMATED_MESH_TYPE getMeshType() const
     116             :                 {
     117           0 :                         return Type;
     118             :                 }
     119             : 
     120             :                 //! returns amount of mesh buffers.
     121       98116 :                 virtual u32 getMeshBufferCount() const
     122             :                 {
     123       98116 :                         if (Meshes.empty())
     124           0 :                                 return 0;
     125             : 
     126       98116 :                         return Meshes[0]->getMeshBufferCount();
     127             :                 }
     128             : 
     129             :                 //! returns pointer to a mesh buffer
     130       58693 :                 virtual IMeshBuffer* getMeshBuffer(u32 nr) const
     131             :                 {
     132       58693 :                         if (Meshes.empty())
     133           0 :                                 return 0;
     134             : 
     135       58693 :                         return Meshes[0]->getMeshBuffer(nr);
     136             :                 }
     137             : 
     138             :                 //! Returns pointer to a mesh buffer which fits a material
     139             :                 /** \param material: material to search for
     140             :                 \return Returns the pointer to the mesh buffer or
     141             :                 NULL if there is no such mesh buffer. */
     142           0 :                 virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
     143             :                 {
     144           0 :                         if (Meshes.empty())
     145           0 :                                 return 0;
     146             : 
     147           0 :                         return Meshes[0]->getMeshBuffer(material);
     148             :                 }
     149             : 
     150             :                 //! Set a material flag for all meshbuffers of this mesh.
     151           0 :                 virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
     152             :                 {
     153           0 :                         for (u32 i=0; i<Meshes.size(); ++i)
     154           0 :                                 Meshes[i]->setMaterialFlag(flag, newvalue);
     155           0 :                 }
     156             : 
     157             :                 //! set the hardware mapping hint, for driver
     158           0 :                 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX )
     159             :                 {
     160           0 :                         for (u32 i=0; i<Meshes.size(); ++i)
     161           0 :                                 Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
     162           0 :                 }
     163             : 
     164             :                 //! flags the meshbuffer as changed, reloads hardware buffers
     165           0 :                 virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX)
     166             :                 {
     167           0 :                         for (u32 i=0; i<Meshes.size(); ++i)
     168           0 :                                 Meshes[i]->setDirty(buffer);
     169           0 :                 }
     170             : 
     171             :                 //! All meshes defining the animated mesh
     172             :                 core::array<IMesh*> Meshes;
     173             : 
     174             :                 //! The bounding box of this mesh
     175             :                 core::aabbox3d<f32> Box;
     176             : 
     177             :                 //! Default animation speed of this mesh.
     178             :                 f32 FramesPerSecond;
     179             : 
     180             :                 //! The type of the mesh.
     181             :                 E_ANIMATED_MESH_TYPE Type;
     182             :         };
     183             : 
     184             : 
     185             : } // end namespace scene
     186             : } // end namespace irr
     187             : 
     188             : #endif
     189             : 

Generated by: LCOV version 1.11