Przeglądaj źródła

Update to use vertex arrays

Gary Hsu 6 lat temu
rodzic
commit
ca3db23e16
1 zmienionych plików z 26 dodań i 8 usunięć
  1. 26 8
      src/Engine/babylon.nativeEngine.ts

+ 26 - 8
src/Engine/babylon.nativeEngine.ts

@@ -2,12 +2,18 @@
     interface INativeEngine {
         requestAnimationFrame(callback: () => void): void;
 
+        createVertexArray(): any;
+        deleteVertexArray(vertexArray: any): void;
+        bindVertexArray(vertexArray: any): void;
+
         createIndexBuffer(data: ArrayBufferView): any;
-        bindIndexBuffer(buffer: any): void;
         deleteIndexBuffer(buffer: any): void;
+        recordIndexBuffer(vertexArray: any, buffer: any): void;
+
         createVertexBuffer(data: Float32Array): any;
-        bindVertexBuffer(buffer: any, location: number, byteOffset: number, byteStride: number): void;
         deleteVertexBuffer(buffer: any): void;
+        recordVertexBuffer(vertexArray: any, buffer: any, location: number, byteOffset: number, byteStride: number): void;
+
         createProgram(vertexShader: string, fragmentShader: string): WebGLProgram;
         getUniforms(shaderProgram: WebGLProgram, uniformsNames: string[]): WebGLUniformLocation[];
         getAttributes(shaderProgram: WebGLProgram, attributeNames: string[]): number[];
@@ -68,7 +74,7 @@
         _nativeIndexBuffer?: any;
         _nativeVertexBuffer?: any;
 
-        // Vertex buffers that are holding native vertex buffers that required conversion to float
+        // Vertex buffers that required conversion to float
         _vertexBuffers?: VertexBufferInfo[];
     }
 
@@ -216,7 +222,7 @@
             this._caps.drawBuffersExtension = false;
 
             this._caps.depthTextureExtension = false;
-            this._caps.vertexArrayObject = false;
+            this._caps.vertexArrayObject = true;
             this._caps.instancedArrays = false;
 
             Tools.Log("Babylon Native (v" + Engine.Version + ") launched");
@@ -262,10 +268,12 @@
             } as WebGLBufferInfo;
         }
 
-        public bindBuffers(vertexBuffers: { [key: string]: VertexBufferInfo }, indexBuffer: WebGLBufferInfo, effect: Effect): void {
+        public recordVertexArrayObject(vertexBuffers: { [key: string]: VertexBufferInfo; }, indexBuffer: Nullable<WebGLBufferInfo>, effect: Effect): WebGLVertexArrayObject {
+            var vertexArray = this._native.createVertexArray();
+
             // Index
             if (indexBuffer) {
-                this._native.bindIndexBuffer(indexBuffer._nativeIndexBuffer);
+                this._native.recordIndexBuffer(vertexArray, indexBuffer._nativeIndexBuffer);
             }
 
             // Vertex
@@ -287,7 +295,7 @@
                                     const length = data.byteLength / Float32Array.BYTES_PER_ELEMENT;
                                     buffer._nativeVertexBuffer = this._native.createVertexBuffer(new Float32Array(data.buffer, data.byteOffset, length));
                                 }
-                                this._native.bindVertexBuffer(buffer._nativeVertexBuffer, location, vertexBuffer.byteOffset, vertexBuffer.byteStride);
+                                this._native.recordVertexBuffer(vertexArray, buffer._nativeVertexBuffer, location, vertexBuffer.byteOffset, vertexBuffer.byteStride);
                             }
                             else {
                                 // TODO: do this only for implementations that require it.
@@ -301,12 +309,22 @@
                                     buffer._vertexBuffers = buffer._vertexBuffers || [];
                                     buffer._vertexBuffers.push(vertexBuffer);
                                 }
-                                this._native.bindVertexBuffer(nativeBuffer, location, 0, vertexBuffer.getSize() * Float32Array.BYTES_PER_ELEMENT);
+                                this._native.recordVertexBuffer(vertexArray, nativeBuffer, location, 0, vertexBuffer.getSize() * Float32Array.BYTES_PER_ELEMENT);
                             }
                         }
                     }
                 }
             }
+
+            return vertexArray;
+        }
+
+        public bindVertexArrayObject(vertexArray: WebGLVertexArrayObject, indexBuffer: Nullable<WebGLBuffer>): void {
+            this._native.bindVertexArray(vertexArray);
+        }
+
+        public releaseVertexArrayObject(vertexArray: WebGLVertexArrayObject) {
+            this._native.deleteVertexArray(vertexArray);
         }
 
         public getAttributes(shaderProgram: WebGLProgram, attributesNames: string[]): number[] {