public static extern unsafe void FNA3D_ApplyVertexBufferBindings( IntPtr device, FNA3D_VertexBufferBinding *bindings, int numBindings, byte bindingsUpdated, int baseVertex );
// // Set Buffer Attributes // public static unsafe void FNA3D_ApplyVertexBufferBindings(IntPtr device, FNA3D_VertexBufferBinding *bindings, int numBindings, byte bindingsUpdated, int baseVertex) { /* skip if FNA says the bindings have not been updated * if (baseVertex == ((State) renderer.UserData).BaseVertex.getAndSet(baseVertex)) * { * if (bindingsUpdated == 0) * return; * }*/ var bindingsCopy = new FNA3D_VertexBufferBinding[numBindings]; for (int i = 0; i < numBindings; i++) { bindingsCopy[i] = bindings[i]; } Renderer.Get(device).Send(false, () => { int nextAttribIndex = 0; foreach (var binding in bindingsCopy) { if (binding.instanceFrequency != 0) { throw new ArgumentException("InstanceFrequnecy != 0"); } GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, (int)binding.vertexBuffer); var vertexDecl = binding.vertexDeclaration; var elements = (VertexElement[])System.Runtime.InteropServices.GCHandle .FromIntPtr(vertexDecl.elements).Target; for (int j = 0; j < vertexDecl.elementCount; j++) { if (elements[j].UsageIndex != 0) { throw new ArgumentException("UsageIndex != 0"); } var fmt = elements[j].VertexElementFormat; int size = VertexElementToBindingSize[(int)fmt]; int type = VertexElementToBindingType[(int)fmt]; bool norm = (elements[j].VertexElementUsage == VertexElementUsage.Color || fmt == VertexElementFormat.NormalizedShort2 || fmt == VertexElementFormat.NormalizedShort4); int stride = vertexDecl.vertexStride; int offset = (binding.vertexOffset + baseVertex) * stride + elements[j].Offset; GLES20.glVertexAttribPointer(nextAttribIndex, size, type, norm, stride, offset); GLES20.glEnableVertexAttribArray(nextAttribIndex++); } } }); }