1 /* 2 ----------------------------------------------------------------------------- 3 This source file is part of OGRE 4 (Object-oriented Graphics Rendering Engine) 5 For the latest info, see http://www.ogre3d.org/ 6 7 Copyright (c) 2000-2014 Torus Knot Software Ltd 8 9 Permission is hereby granted, free of charge, to any person obtaining a copy 10 of this software and associated documentation files (the "Software"), to deal 11 in the Software without restriction, including without limitation the rights 12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 copies of the Software, and to permit persons to whom the Software is 14 furnished to do so, subject to the following conditions: 15 16 The above copyright notice and this permission notice shall be included in 17 all copies or substantial portions of the Software. 18 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 THE SOFTWARE. 26 ----------------------------------------------------------------------------- 27 */ 28 #ifndef __RenderToVertexBuffer_H__ 29 #define __RenderToVertexBuffer_H__ 30 31 #include "OgrePrerequisites.h" 32 #include "OgreRenderOperation.h" 33 #include "OgreHeaderPrefix.h" 34 35 namespace Ogre { 36 /** \addtogroup Core 37 * @{ 38 */ 39 /** \addtogroup RenderSystem 40 * @{ 41 */ 42 /** 43 An object which renders geometry to a vertex. 44 @remarks 45 This is especially useful together with geometry shaders, as you can 46 render procedural geometry which will get saved to a vertex buffer for 47 reuse later, without regenerating it again. You can also create shaders 48 that run on previous results of those shaders, creating stateful 49 shaders. 50 */ 51 class _OgreExport RenderToVertexBuffer 52 { 53 public: 54 RenderToVertexBuffer(); 55 virtual ~RenderToVertexBuffer(); 56 57 /** 58 Get the vertex declaration that the pass will output. 59 @remarks 60 Use this object to set the elements of the buffer. Object will calculate 61 buffers on its own. Only one source allowed! 62 */ 63 VertexDeclaration* getVertexDeclaration(); 64 65 /** 66 Get the maximum number of vertices that the buffer will hold 67 */ getMaxVertexCount()68 unsigned int getMaxVertexCount() const { return mMaxVertexCount; } 69 70 /** 71 Set the maximum number of vertices that the buffer will hold 72 */ setMaxVertexCount(unsigned int maxVertexCount)73 void setMaxVertexCount(unsigned int maxVertexCount) { mMaxVertexCount = maxVertexCount; } 74 75 /** 76 What type of primitives does this object generate? 77 */ getOperationType()78 RenderOperation::OperationType getOperationType() const { return mOperationType; } 79 80 /** 81 Set the type of primitives that this object generates 82 */ setOperationType(RenderOperation::OperationType operationType)83 void setOperationType(RenderOperation::OperationType operationType) { mOperationType = operationType; } 84 85 /** 86 Set whether this object resets its buffers each time it updates. 87 */ setResetsEveryUpdate(bool resetsEveryUpdate)88 void setResetsEveryUpdate(bool resetsEveryUpdate) { mResetsEveryUpdate = resetsEveryUpdate; } 89 90 /** 91 Does this object reset its buffer each time it updates? 92 */ getResetsEveryUpdate()93 bool getResetsEveryUpdate() const { return mResetsEveryUpdate; } 94 95 /** 96 Get the render operation for this buffer 97 */ 98 virtual void getRenderOperation(RenderOperation& op) = 0; 99 100 /** 101 Update the contents of this vertex buffer by rendering 102 */ 103 virtual void update(SceneManager* sceneMgr) = 0; 104 105 /** 106 Reset the vertex buffer to the initial state. In the next update, 107 the source renderable will be used as input. 108 */ reset()109 virtual void reset() { mResetRequested = true; } 110 111 /** 112 Set the source renderable of this object. During the first (and 113 perhaps later) update of this object, this object's data will be 114 used as input) 115 */ setSourceRenderable(Renderable * source)116 void setSourceRenderable(Renderable* source) { mSourceRenderable = source; } 117 118 /** 119 Get the source renderable of this object 120 */ getSourceRenderable()121 const Renderable* getSourceRenderable() const { return mSourceRenderable; } 122 123 /** 124 Get the material which is used to render the geometry into the 125 vertex buffer. 126 */ getRenderToBufferMaterial()127 const MaterialPtr& getRenderToBufferMaterial() { return mMaterial; } 128 129 /** 130 Set the material name which is used to render the geometry into 131 the vertex buffer 132 */ 133 void setRenderToBufferMaterialName(const String& materialName); 134 135 protected: 136 RenderOperation::OperationType mOperationType; 137 bool mResetsEveryUpdate; 138 bool mResetRequested; 139 MaterialPtr mMaterial; 140 Renderable* mSourceRenderable; 141 std::unique_ptr<VertexData> mVertexData; 142 unsigned int mMaxVertexCount; 143 }; 144 145 /** @} */ 146 /** @} */ 147 } 148 149 #include "OgreHeaderSuffix.h" 150 151 #endif 152