Merge remote-tracking branch 'glBitmap.delphigl.com/unstable'
[LazOpenGLCore.git] / uglcArrayBuffer.pas
index e7acaa2..8a65b62 100644 (file)
@@ -2,7 +2,80 @@ unit uglcArrayBuffer;
 
 { Package:      OpenGLCore
   Prefix:       glc - OpenGL Core
-  Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer }
+  Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer
+  Beispiel:
+    type
+      TVertex = packed record
+        pos: TgluVector3f; // vertex position
+        tex: TgluVector2f; // texture coordinates
+        nor: TgluVector3f; // normal
+      end;
+      PVertex = ^TVertex;
+
+    var
+      vBuffer: TglcArrayBuffer;
+      iBuffer: TglcArrayBuffer;
+      p: Pointer;
+
+    vBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
+    iBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btElementArrayBuffer);
+    try
+      // write vertex data to vertex buffer
+      vBuffer.Bind;
+      vBuffer.BufferData(4, SizeOf(TresMeshVertex), TglcBufferUsage.buStaticDraw, nil);
+      p := vBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
+      try
+        PVertex(p).pos := gluVertex3f(0.0, 0.0, 0.0);
+        PVertex(p).tex := gluVertex2f(0.0, 0.5);
+        PVertex(p).nor := gluVertex3f(0.0, 1.0, 0.0);
+        inc(p, SizeOf(TVertex));
+        // ... 
+      finally
+        vBuffer.UnmapBuffer;
+        vBuffer.Unbind;
+      end;
+
+      // write indices to index buffer 
+      iBuffer.Bind;
+      iBuffer.BufferData(4, SizeOf(GLuint), TglcBufferUsage.buStaticDraw, nil);
+      p := iBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
+      try
+        PGLuint(p) := 0;
+        //  ...
+      finally
+        iBuffer.UnmapBuffer;
+        iBuffer.Unbind;
+      end;
+
+      // use array buffers to draw primitive
+      vBuffer.Bind;
+      iBuffer.Bind;
+
+      glEnableClientState(GL_VERTEX_ARRAY);
+      glVertexPointer(3, GL_FLOAT, 8, Pointer(0));
+
+      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+      glTexCoordPointer(2, GL_FLOAT, 8, Pointer(3));
+
+      glEnableClientState(GL_NORMAL_ARRAY);
+      glNormalPointer(GL_FLOAT, 8, Pointer(5));
+
+      glEnableClientState(GL_INDEX_ARRAY);
+      glIndexPointer(GL_INT, 0, nil);
+
+      glDrawElements(GL_QUADS, iBuffer.DataCount, GL_UNSIGNED_INT, nil);
+
+      glDisableClientState(GL_INDEX_ARRAY);
+      glDisableClientState(GL_VERTEX_ARRAY);
+      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+      glDisableClientState(GL_NORMAL_ARRAY);
+
+      fIndexBuffer.Unbind;
+      fVertexBuffer.Unbind;
+    finally
+      FreeAndNil(vBuffer);
+      FreeAndNil(iBuffer);
+    end; }
 
 {$mode objfpc}{$H+}