]> git.tdb.fi Git - libs/gl.git/blobdiff - source/render/instancearray.h
Store simpler states by value in PipelineState
[libs/gl.git] / source / render / instancearray.h
index 6a598b5854f3183e290896eb052708f32c0f98a6..e6f8690c68cd5b2000d25f9bb7d770f063fcc1f4 100644 (file)
@@ -2,8 +2,11 @@
 #define MSP_GL_INSTANCEARRAY_H_
 
 #include <vector>
+#include <msp/core/noncopyable.h>
 #include "programdata.h"
 #include "renderable.h"
+#include "vertexarray.h"
+#include "vertexsetup.h"
 
 namespace Msp {
 namespace GL {
@@ -11,16 +14,18 @@ namespace GL {
 class Buffer;
 class Object;
 class ObjectInstance;
-class VertexArray;
-class VertexSetup;
 
 /**
-Renders multiple instances of an Object in an efficient manner.  If instanced
-rendering is supported, only one draw call per Batch needs to be issued.
+Renders multiple instances of an Object in an efficient manner.
 
-Changing the Mesh of the Object while an InstanceArray exists is not supported.
+The instance specific transform is passed to the shader in an attribute with
+the name instance_transform.  The attribute should have the type vec4[3].  Each
+elements of the array corresponds to a row of the transform matrix.
+
+If the Mesh or Technique of the Object is changed during the lifetime of the
+InstanceArray, behaviour is undefined.
 */
-class InstanceArray: public Renderable
+class InstanceArray: public Renderable, public NonCopyable
 {
 public:
        template<typename T>
@@ -39,11 +44,11 @@ public:
 private:
        const Object &object;
        std::vector<ObjectInstance *> instances;
-       VertexArray *instance_data;
-       Buffer *instance_buffer;
-       VertexSetup *vtx_setup;
-       int matrix_location;
-       unsigned matrix_offset;
+       VertexArray instance_data;
+       Buffer *instance_buffer = 0;
+       VertexSetup vtx_setup;
+       int matrix_location = -1;
+       unsigned matrix_offset = 0;
 
 public:
        InstanceArray(const Object &);
@@ -51,6 +56,8 @@ public:
 
        void set_matrix_attribute(const std::string &);
 
+       /** Adds a new instance to the array.  The instance class must have a
+       constructor taking a const reference to Object as its sole parameter. */
        template<typename T = ObjectInstance>
        T &append();
 private: