Exemplo n.º 1
0
 public static extern unsafe void FNA3D_ApplyVertexBufferBindings(
     IntPtr device,
     FNA3D_VertexBufferBinding *bindings,
     int numBindings,
     byte bindingsUpdated,
     int baseVertex
     );
Exemplo n.º 2
0
        //
        // 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++);
                    }
                }
            });
        }