00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2012 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef __BaseInstanceBatchVTF_H__ 00029 #define __BaseInstanceBatchVTF_H__ 00030 00031 #include "OgreInstanceBatch.h" 00032 #include "OgreTexture.h" 00033 00034 namespace Ogre 00035 { 00074 class _OgreExport BaseInstanceBatchVTF : public InstanceBatch 00075 { 00076 protected: 00077 typedef vector<uint8>::type HWBoneIdxVec; 00078 typedef vector<float>::type HWBoneWgtVec; 00079 typedef vector<Matrix4>::type Matrix4Vec; 00080 00081 size_t mMatricesPerInstance; //number of bone matrices per instance 00082 size_t mNumWorldMatrices; //Num bones * num instances 00083 TexturePtr mMatrixTexture; //The VTF 00084 00085 //Used when all matrices from each instance must be in the same row (i.e. HW Instancing). 00086 //A few pixels are wasted, but resizing the texture puts the danger of not sampling the 00087 //right pixel... (in theory it should work, but in practice doesn't) 00088 size_t mWidthFloatsPadding; 00089 size_t mMaxFloatsPerLine; 00090 00091 size_t mRowLength; 00092 size_t mWeightCount; 00093 //Temporary array used to store 3x4 matrices before they are converted to dual quaternions 00094 float* mTempTransformsArray3x4; 00095 00096 // The state of the usage of bone matrix lookup 00097 bool mUseBoneMatrixLookup; 00098 size_t mMaxLookupTableInstances; 00099 00100 bool mUseBoneDualQuaternions; 00101 bool mForceOneWeight; 00102 bool mUseOneWeight; 00103 00107 void cloneMaterial( const MaterialPtr &material ); 00108 00113 void retrieveBoneIdx( VertexData *baseVertexData, HWBoneIdxVec &outBoneIdx ); 00114 00119 void retrieveBoneIdxWithWeights(VertexData *baseVertexData, HWBoneIdxVec &outBoneIdx, HWBoneWgtVec &outBoneWgt); 00120 00122 void setupMaterialToUseVTF( TextureType textureType, MaterialPtr &material ); 00123 00125 void createVertexTexture( const SubMesh* baseSubMesh ); 00126 00128 virtual void createVertexSemantics( VertexData *thisVertexData, VertexData *baseVertexData, 00129 const HWBoneIdxVec &hwBoneIdx, const HWBoneWgtVec &hwBoneWgt) = 0; 00130 00131 size_t convert3x4MatricesToDualQuaternions(float* matrices, size_t numOfMatrices, float* outDualQuaternions); 00132 00134 void updateVertexTexture(void); 00135 00137 virtual bool matricesToghetherPerRow() const = 0; 00138 00140 virtual void updateSharedLookupIndexes(); 00141 00143 virtual InstancedEntity* generateInstancedEntity(size_t num); 00144 00145 public: 00146 BaseInstanceBatchVTF( InstanceManager *creator, MeshPtr &meshReference, const MaterialPtr &material, 00147 size_t instancesPerBatch, const Mesh::IndexMap *indexToBoneMap, 00148 const String &batchName); 00149 virtual ~BaseInstanceBatchVTF(); 00150 00152 void buildFrom( const SubMesh *baseSubMesh, const RenderOperation &renderOperation ); 00153 00154 //Renderable overloads 00155 void getWorldTransforms( Matrix4* xform ) const; 00156 unsigned short getNumWorldTransforms(void) const; 00157 00159 void _updateRenderQueue(RenderQueue* queue); 00160 00173 void setBoneMatrixLookup(bool enable, size_t maxLookupTableInstances) { assert(mInstancedEntities.empty()); 00174 mUseBoneMatrixLookup = enable; mMaxLookupTableInstances = maxLookupTableInstances; } 00175 00179 bool useBoneMatrixLookup() const { return mUseBoneMatrixLookup; } 00180 00181 void setBoneDualQuaternions(bool enable) { assert(mInstancedEntities.empty()); 00182 mUseBoneDualQuaternions = enable; mRowLength = (mUseBoneDualQuaternions ? 2 : 3); } 00183 00184 bool useBoneDualQuaternions() const { return mUseBoneDualQuaternions; } 00185 00186 void setForceOneWeight(bool enable) { assert(mInstancedEntities.empty()); 00187 mForceOneWeight = enable; } 00188 00189 bool forceOneWeight() const { return mForceOneWeight; } 00190 00191 void setUseOneWeight(bool enable) { assert(mInstancedEntities.empty()); 00192 mUseOneWeight = enable; } 00193 00194 bool useOneWeight() const { return mUseOneWeight; } 00195 00197 virtual bool useBoneWorldMatrices() const { return !mUseBoneMatrixLookup; } 00198 00200 virtual size_t getMaxLookupTableInstances() const { return mMaxLookupTableInstances; } 00201 00202 }; 00203 00204 class _OgreExport InstanceBatchVTF : public BaseInstanceBatchVTF 00205 { 00206 00207 void setupVertices( const SubMesh* baseSubMesh ); 00208 void setupIndices( const SubMesh* baseSubMesh ); 00209 00211 void createVertexSemantics( VertexData *thisVertexData, VertexData *baseVertexData, 00212 const HWBoneIdxVec &hwBoneIdx, const HWBoneWgtVec &hwBoneWgt ); 00213 00214 virtual bool matricesToghetherPerRow() const { return false; } 00215 public: 00216 InstanceBatchVTF( InstanceManager *creator, MeshPtr &meshReference, const MaterialPtr &material, 00217 size_t instancesPerBatch, const Mesh::IndexMap *indexToBoneMap, 00218 const String &batchName); 00219 virtual ~InstanceBatchVTF(); 00220 00222 size_t calculateMaxNumInstances( const SubMesh *baseSubMesh, uint16 flags ) const; 00223 }; 00224 } 00225 00226 #endif
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:24 2012