OgreInstanceBatch.h
Go to the documentation of this file.
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4 (Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2013 Torus Knot Software Ltd
8
9Permission is hereby granted, free of charge, to any person obtaining a copy
10of this software and associated documentation files (the "Software"), to deal
11in the Software without restriction, including without limitation the rights
12to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13copies of the Software, and to permit persons to whom the Software is
14furnished to do so, subject to the following conditions:
15
16The above copyright notice and this permission notice shall be included in
17all copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25THE SOFTWARE.
26-----------------------------------------------------------------------------
27*/
28#ifndef __InstanceBatch_H__
29#define __InstanceBatch_H__
30
31#include "OgrePrerequisites.h"
32#include "OgreRenderOperation.h"
33#include "OgreRenderable.h"
34#include "OgreMovableObject.h"
35#include "OgreMesh.h"
36#include "OgreHeaderPrefix.h"
37
38namespace Ogre
39{
89 {
90 public:
93 protected:
96
98
100
103
104 //InstancedEntities are all allocated at build time and kept as "unused"
105 //when they're requested, they're removed from there when requested,
106 //and put back again when they're no longer needed
107 //Note each InstancedEntity has a unique ID ranging from [0; mInstancesPerBatch)
110
115
120 bool mBoundsUpdated; //Set to false by derived classes that need it
122
123 unsigned short mMaterialLodIndex;
124
125 bool mDirtyAnimation; //Set to false at start of each _updateRenderQueue
126
129
133 mutable const Camera *mCachedCamera;
134
137
142
143 virtual void setupVertices( const SubMesh* baseSubMesh ) = 0;
144 virtual void setupIndices( const SubMesh* baseSubMesh ) = 0;
145 virtual void createAllInstancedEntities(void);
146 virtual void deleteAllInstancedEntities(void);
150
155 void makeMatrixCameraRelative3x4( float *mat3x4, size_t numFloats );
156
158 virtual bool checkSubMeshCompatibility( const SubMesh* baseSubMesh );
159
161
163 void defragmentBatchNoCull( InstancedEntityVec &usedEntities, CustomParamsVec &usedParams );
164
170 void defragmentBatchDoCull( InstancedEntityVec &usedEntities, CustomParamsVec &usedParams );
171
172 public:
173 InstanceBatch( InstanceManager *creator, MeshPtr &meshReference, const MaterialPtr &material,
174 size_t instancesPerBatch, const Mesh::IndexMap *indexToBoneMap,
175 const String &batchName );
176 virtual ~InstanceBatch();
177
178 MeshPtr& _getMeshRef() { return mMeshReference; }
179
182 void _setInstancesPerBatch( size_t instancesPerBatch );
183
184 const Mesh::IndexMap* _getIndexToBoneMap() const { return mIndexToBoneMap; }
185
192 bool _supportsSkeletalAnimation() const { return mTechnSupportsSkeletal; }
193
195 void _updateBounds(void);
196
207 virtual size_t calculateMaxNumInstances( const SubMesh *baseSubMesh, uint16 flags ) const = 0;
208
222 virtual RenderOperation build( const SubMesh* baseSubMesh );
223
236 virtual void buildFrom( const SubMesh *baseSubMesh, const RenderOperation &renderOperation );
237
238 const Ogre::MeshPtr& _getMeshReference(void) const { return mMeshReference; }
239
243 bool isBatchFull(void) const { return mUnusedEntities.empty(); }
244
247 bool isBatchUnused(void) const { return mUnusedEntities.size() == mInstancedEntities.size(); }
248
253
267 void _defragmentBatch( bool optimizeCulling, InstancedEntityVec &usedEntities,
268 CustomParamsVec &usedParams );
269
276
280 virtual void _boundsDirty(void);
281
295 virtual void setStaticAndUpdate( bool bStatic ) {}
296
299 virtual bool isStatic() const { return false; }
300
308
315 void removeInstancedEntity( InstancedEntity *instancedEntity );
316
320 virtual bool useBoneWorldMatrices() const { return true; }
321
323 void _markTransformSharingDirty() { mTransformSharingDirty = true; }
324
326 void _setCustomParam( InstancedEntity *instancedEntity, unsigned char idx, const Vector4 &newParam );
327
329 const Vector4& _getCustomParam( InstancedEntity *instancedEntity, unsigned char idx );
330
331 //Renderable overloads
333 const MaterialPtr& getMaterial(void) const { return mMaterial; }
335 void getRenderOperation( RenderOperation& op ) { op = mRenderOperation; }
336
338 Real getSquaredViewDepth( const Camera* cam ) const;
340 const LightList& getLights( void ) const;
343
345 const String& getMovableType(void) const;
349 const AxisAlignedBox& getBoundingBox(void) const;
352
353 virtual void _updateRenderQueue(RenderQueue* queue);
354 void visitRenderables( Renderable::Visitor* visitor, bool debugRenderables = false );
355
356 // resolve ambiguity of get/setUserAny due to inheriting from Renderable and MovableObject
359 };
360} // namespace Ogre
361
362#include "OgreHeaderSuffix.h"
363
364#endif // __InstanceBatch_H__
#define _OgreExport
Definition: OgrePlatform.h:257
A 3D box aligned with the x/y/z axes.
A viewpoint from which the scene will be rendered.
Definition: OgreCamera.h:87
InstanceBatch forms part of the new Instancing system This is an abstract class that must be derived ...
This is the main starting point for the new instancing system.
vector< unsignedshort >::type IndexMap
Definition: OgreMesh.h:108
Abstract class defining a movable object in a scene.
'New' rendering operation using vertex buffers.
Class to manage the scene object rendering queue.
Visitor object that can be used to iterate over a collection of Renderable instances abstractly.
Abstract class defining the interface all renderable objects must implement.
virtual OGRE_DEPRECATED const Any & getUserAny(void) const
virtual OGRE_DEPRECATED void setUserAny(const Any &anything)
Defines a part of a complete mesh.
Definition: OgreSubMesh.h:63
Class representing an approach to rendering this particular Material.
Definition: OgreTechnique.h:54
4-dimensional homogeneous vector.
Definition: OgreVector4.h:46
virtual bool checkSubMeshCompatibility(const SubMesh *baseSubMesh)
Returns false on errors that would prevent building this batch from the given submesh.
InstanceBatch(InstanceManager *creator, MeshPtr &meshReference, const MaterialPtr &material, size_t instancesPerBatch, const Mesh::IndexMap *indexToBoneMap, const String &batchName)
CustomParamsVec mCustomParams
bool isBatchUnused(void) const
Returns true if it no instanced entity has been requested or all of them have been removed.
Mesh::IndexMap const * mIndexToBoneMap
Real getSquaredViewDepth(const Camera *cam) const
Returns the camera-relative squared depth of this renderable.
AxisAlignedBox mFullBoundingBox
This bbox contains all (visible) instanced entities.
virtual void setupIndices(const SubMesh *baseSubMesh)=0
InstancedEntityVec mInstancedEntities
void _markTransformSharingDirty()
Tells that the list of entity instances with shared transforms has changed.
Technique * getTechnique(void) const
Retrieves a pointer to the Material Technique this renderable object uses.
virtual InstancedEntity * generateInstancedEntity(size_t num)
Creates a new InstancedEntity instance.
vector< Vector4 >::type CustomParamsVec
virtual size_t calculateMaxNumInstances(const SubMesh *baseSubMesh, uint16 flags) const =0
Some techniques have a limit on how many instances can be done.
void _defragmentBatch(bool optimizeCulling, InstancedEntityVec &usedEntities, CustomParamsVec &usedParams)
bool mRemoveOwnIndexData
When true remove the memory of the IndexData we've created because no one else will.
Real mCachedCameraDist
Cached distance to last camera for getSquaredViewDepth.
const Vector4 & _getCustomParam(InstancedEntity *instancedEntity, unsigned char idx)
void defragmentBatchDoCull(InstancedEntityVec &usedEntities, CustomParamsVec &usedParams)
bool _supportsSkeletalAnimation() const
Returns true if this technique supports skeletal animation.
bool mTechnSupportsSkeletal
False if a technique doesn't support skeletal animation.
void _setCustomParam(InstancedEntity *instancedEntity, unsigned char idx, const Vector4 &newParam)
void defragmentBatchNoCull(InstancedEntityVec &usedEntities, CustomParamsVec &usedParams)
virtual ~InstanceBatch()
void removeInstancedEntity(InstancedEntity *instancedEntity)
Removes an InstancedEntity from the scene retrieved with getNewInstancedEntity, putting back into a q...
virtual void buildFrom(const SubMesh *baseSubMesh, const RenderOperation &renderOperation)
Instancing consumes significantly more GPU memory than regular rendering methods.
virtual void createAllInstancedEntities(void)
virtual void deleteUnusedInstancedEntities(void)
const MaterialPtr & getMaterial(void) const
Retrieves a weak reference to the material this renderable object uses.
void _defragmentBatchDiscard(void)
Real getBoundingRadius(void) const
Retrieves the radius of the origin-centered bounding sphere for this object.
virtual RenderOperation build(const SubMesh *baseSubMesh)
Constructs all the data needed to use this batch, as well as the InstanceEntities.
const String & getMovableType(void) const
Returns the type name of this object.
void _updateBounds(void)
void _setInstancesPerBatch(size_t instancesPerBatch)
Raises an exception if trying to change it after being built.
virtual void deleteAllInstancedEntities(void)
InstancedEntity * createInstancedEntity()
Returns a pointer to a new InstancedEntity ready to use Note it's actually preallocated,...
InstancedEntityVec mUnusedEntities
void visitRenderables(Renderable::Visitor *visitor, bool debugRenderables=false)
Method to allow a caller to abstractly iterate over the Renderable instances that this MovableObject ...
bool mRemoveOwnVertexData
When true remove the memory of the VertexData we've created because no one else will.
const LightList & getLights(void) const
Gets a list of lights, ordered relative to how close they are to this renderable.
virtual void _boundsDirty(void)
Called by InstancedEntity(s) to tell us we need to update the bounds (we touch the SceneNode so the S...
virtual void _updateRenderQueue(RenderQueue *queue)
Internal method by which the movable object must add Renderable subclass instances to the rendering q...
virtual void setupVertices(const SubMesh *baseSubMesh)=0
const Mesh::IndexMap * _getIndexToBoneMap() const
virtual void setStaticAndUpdate(bool bStatic)
Tells this batch to stop updating animations, positions, rotations, and display all it's active insta...
const Ogre::MeshPtr & _getMeshReference(void) const
bool isBatchFull(void) const
const Camera * mCachedCamera
The camera for which the cached distance is valid.
void getRenderOperation(RenderOperation &op)
Gets the render operation required to send this object to the frame buffer.
InstanceManager * mCreator
void makeMatrixCameraRelative3x4(float *mat3x4, size_t numFloats)
Takes an array of 3x4 matrices and makes it camera relative.
void updateVisibility(void)
RenderOperation mRenderOperation
virtual bool useBoneWorldMatrices() const
Tells whether world bone matrices need to be calculated.
void _notifyCurrentCamera(Camera *cam)
Internal method to notify the object of the camera to be used for the next rendering operation.
void getInstancedEntitiesInUse(InstancedEntityVec &outEntities, CustomParamsVec &outParams)
Fills the input vector with the instances that are currently being used or were requested.
unsigned short mMaterialLodIndex
const AxisAlignedBox & getBoundingBox(void) const
Retrieves the local axis-aligned bounding box for this object.
bool mTransformSharingDirty
Tells that the list of entity instances with shared transforms has changed.
vector< InstancedEntity * >::type InstancedEntityVec
virtual bool isStatic() const
Returns true if this batch was set as static.
float Real
Software floating point type.
unsigned short uint16
Definition: OgrePlatform.h:360
_StringBase String

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.