# Home    # nevrax.com   
Nevrax
Nevrax.org
#News
#Mailing-list
#Documentation
#CVS
#Bugs
#License
Docs
 
Documentation  
Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages   Search  

mesh_instance.cpp

Go to the documentation of this file.
00001 
00007 /* Copyright, 2001 Nevrax Ltd.
00008  *
00009  * This file is part of NEVRAX NEL.
00010  * NEVRAX NEL is free software; you can redistribute it and/or modify
00011  * it under the terms of the GNU General Public License as published by
00012  * the Free Software Foundation; either version 2, or (at your option)
00013  * any later version.
00014 
00015  * NEVRAX NEL is distributed in the hope that it will be useful, but
00016  * WITHOUT ANY WARRANTY; without even the implied warranty of
00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00018  * General Public License for more details.
00019 
00020  * You should have received a copy of the GNU General Public License
00021  * along with NEVRAX NEL; see the file COPYING. If not, write to the
00022  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00023  * MA 02111-1307, USA.
00024  */
00025 
00026 #include "std3d.h"
00027 
00028 #include "3d/mesh_instance.h"
00029 #include "3d/mesh.h"
00030 #include "3d/skeleton_model.h"
00031 #include <list>
00032 
00033 using namespace std;
00034 
00035 namespace NL3D 
00036 {
00037 
00038 // ***************************************************************************
00039 CMeshInstance::CMeshInstance()
00040 {
00041         // LoadBalancing is not usefull for Mesh, because meshs cannot be reduced in faces.
00042         // Override CTransformShape state.
00043         CTransform::setIsLoadbalancable(false);
00044 }
00045 
00046 // ***************************************************************************
00047 CMeshInstance::~CMeshInstance()
00048 {
00049         // Auto detach me from skeleton. Must do it here, not in ~CTransform().
00050         if(_FatherSkeletonModel)
00051         {
00052                 // detach me from the skeleton.
00053                 // Observers hierarchy is modified.
00054                 _FatherSkeletonModel->detachSkeletonSon(this);
00055                 nlassert(_FatherSkeletonModel==NULL);
00056         }
00057 }
00058 
00059 
00060 // ***************************************************************************
00061 void            CMeshInstance::registerBasic()
00062 {
00063         CMOT::registerModel(MeshInstanceId, MeshBaseInstanceId, CMeshInstance::creator);
00064 }
00065 
00066 // ***************************************************************************
00067 void            CMeshInstance::setApplySkin(bool state)
00068 {
00069         // Call parents method
00070         CMeshBaseInstance::setApplySkin (state);
00071 
00072         // Get a pointer on the shape
00073         CMesh *pMesh = NLMISC::safe_cast<CMesh *>((IShape*)Shape);
00074 
00075         // Recompute the id
00076         if (state)
00077         {
00078                 pMesh->computeBonesId (_FatherSkeletonModel);
00079         }
00080 
00081         // update the skeleton usage according to the mesh.
00082         pMesh->updateSkeletonUsage(_FatherSkeletonModel, state);
00083 }
00084 
00085 
00086 // ***************************************************************************
00087 const std::vector<sint32>       *CMeshInstance::getSkinBoneUsage() const
00088 {
00089         // Get a pointer on the shape
00090         CMesh   *pMesh = NLMISC::safe_cast<CMesh *>((IShape*)Shape);
00091 
00092         // Recompute the id
00093         pMesh->computeBonesId (_FatherSkeletonModel);
00094 
00095         // get ids.
00096         return &pMesh->getMeshGeom().getSkinBoneUsage();
00097 }
00098 
00099 
00100 // ***************************************************************************
00101 bool    CMeshInstance::isSkinnable() const
00102 {
00103         if(Shape==NULL)
00104                 return false;
00105 
00106         // Get a pointer on the shape
00107         CMesh *pMesh = NLMISC::safe_cast<CMesh *>((IShape*)Shape);
00108 
00109         // true if the mesh is skinned
00110         return pMesh->getMeshGeom().isSkinned();
00111 }
00112 
00113 
00114 // ***************************************************************************
00115 void    CMeshInstance::renderSkin(float alphaMRM)
00116 {
00117         // Don't setup lighting or matrix in Skin. Done by the skeleton
00118 
00119         if(Shape && getVisibility() != CHrcTrav::Hide)
00120         {
00121                 // Get a pointer on the shape
00122                 CMesh *pMesh = NLMISC::safe_cast<CMesh *>((IShape*)Shape);
00123 
00124                 // render the meshGeom
00125                 CMeshGeom       &meshGeom= const_cast<CMeshGeom&>(pMesh->getMeshGeom ());
00126                 meshGeom.renderSkin( this, alphaMRM );
00127         }
00128 }
00129 
00130 
00131 } // NL3D