예제 #1
0
        internal void Apply(Shader shader, IntPtr offset)
        {
            int hashCode = shader.GetHashCode();

            VertexDeclaration.VertexDeclarationAttributeInfo declarationAttributeInfo;
            if (!this.shaderAttributeInfo.TryGetValue(hashCode, out declarationAttributeInfo))
            {
                declarationAttributeInfo = new VertexDeclaration.VertexDeclarationAttributeInfo(this.GraphicsDevice.MaxVertexAttributes);
                foreach (VertexElement element in this._elements)
                {
                    int attribLocation = shader.GetAttribLocation(element.VertexElementUsage, element.UsageIndex);
                    if (attribLocation >= 0)
                    {
                        declarationAttributeInfo.Elements.Add(new VertexDeclaration.VertexDeclarationAttributeInfo.Element()
                        {
                            Offset                  = element.Offset,
                            AttributeLocation       = attribLocation,
                            NumberOfElements        = GraphicsExtensions.OpenGLNumberOfElements(element.VertexElementFormat),
                            VertexAttribPointerType = GraphicsExtensions.OpenGLVertexAttribPointerType(element.VertexElementFormat),
                            Normalized              = GraphicsExtensions.OpenGLVertexAttribNormalized(element)
                        });
                        declarationAttributeInfo.EnabledAttributes[attribLocation] = true;
                    }
                }
                this.shaderAttributeInfo.Add(hashCode, declarationAttributeInfo);
            }
            foreach (VertexDeclaration.VertexDeclarationAttributeInfo.Element element in declarationAttributeInfo.Elements)
            {
                GL.VertexAttribPointer(element.AttributeLocation, element.NumberOfElements, element.VertexAttribPointerType, element.Normalized, this.VertexStride, (IntPtr)(offset.ToInt64() + (long)element.Offset));
            }
            this.GraphicsDevice.SetVertexAttributeArray(declarationAttributeInfo.EnabledAttributes);
        }
예제 #2
0
 internal void Apply(Shader shader, IntPtr offset)
 {
   int hashCode = shader.GetHashCode();
   VertexDeclaration.VertexDeclarationAttributeInfo declarationAttributeInfo;
   if (!this.shaderAttributeInfo.TryGetValue(hashCode, out declarationAttributeInfo))
   {
     declarationAttributeInfo = new VertexDeclaration.VertexDeclarationAttributeInfo(this.GraphicsDevice.MaxVertexAttributes);
     foreach (VertexElement element in this._elements)
     {
       int attribLocation = shader.GetAttribLocation(element.VertexElementUsage, element.UsageIndex);
       if (attribLocation >= 0)
       {
         declarationAttributeInfo.Elements.Add(new VertexDeclaration.VertexDeclarationAttributeInfo.Element()
         {
           Offset = element.Offset,
           AttributeLocation = attribLocation,
           NumberOfElements = GraphicsExtensions.OpenGLNumberOfElements(element.VertexElementFormat),
           VertexAttribPointerType = GraphicsExtensions.OpenGLVertexAttribPointerType(element.VertexElementFormat),
           Normalized = GraphicsExtensions.OpenGLVertexAttribNormalized(element)
         });
         declarationAttributeInfo.EnabledAttributes[attribLocation] = true;
       }
     }
     this.shaderAttributeInfo.Add(hashCode, declarationAttributeInfo);
   }
   foreach (VertexDeclaration.VertexDeclarationAttributeInfo.Element element in declarationAttributeInfo.Elements)
     GL.VertexAttribPointer(element.AttributeLocation, element.NumberOfElements, element.VertexAttribPointerType, element.Normalized, this.VertexStride, (IntPtr) (offset.ToInt64() + (long) element.Offset));
   this.GraphicsDevice.SetVertexAttributeArray(declarationAttributeInfo.EnabledAttributes);
 }
예제 #3
0
        internal void Apply(Shader shader, IntPtr offset, int divisor = 0)
        {
            List <Element> attrInfo;
            int            shaderHash = shader.GetHashCode();

            if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo))
            {
                // Get the vertex attribute info and cache it
                attrInfo = new List <Element>(16);                // 16, per XNA4 HiDef spec

                foreach (VertexElement ve in elements)
                {
                    int attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex);

                    // XNA appears to ignore usages it can't find a match for, so we will do the same
                    if (attributeLocation >= 0)
                    {
                        attrInfo.Add(new Element()
                        {
                            Offset                  = ve.Offset,
                            AttributeLocation       = attributeLocation,
                            NumberOfElements        = GetNumberOfElements(ve.VertexElementFormat),
                            VertexAttribPointerType = ve.VertexElementFormat,
                            Normalized              = GetVertexAttribNormalized(ve),
                        });
                    }
                }

                shaderAttributeInfo.Add(shaderHash, attrInfo);
            }

            // Apply the vertex attribute info
            foreach (Element element in attrInfo)
            {
                GraphicsDevice.GLDevice.AttributeEnabled[element.AttributeLocation]   = true;
                GraphicsDevice.GLDevice.Attributes[element.AttributeLocation].Divisor = divisor;
                GraphicsDevice.GLDevice.VertexAttribPointer(
                    element.AttributeLocation,
                    element.NumberOfElements,
                    element.VertexAttribPointerType,
                    element.Normalized,
                    VertexStride,
#if JSIL
                    (IntPtr)(offset.ToInt32() + element.Offset)
#else
                    (IntPtr)(offset.ToInt64() + element.Offset)
#endif
                    );
            }
        }
예제 #4
0
        internal void Apply(Shader shader, IntPtr offset, int divisor = 0)
        {
            VertexDeclarationAttributeInfo attrInfo;
            int shaderHash = shader.GetHashCode();

            if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo))
            {
                // Get the vertex attribute info and cache it
                attrInfo = new VertexDeclarationAttributeInfo(OpenGLDevice.Instance.MaxVertexAttributes);

                foreach (VertexElement ve in elements)
                {
                    int attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex);

                    // XNA appears to ignore usages it can't find a match for, so we will do the same
                    if (attributeLocation >= 0)
                    {
                        attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element()
                        {
                            Offset                  = ve.Offset,
                            AttributeLocation       = attributeLocation,
                            NumberOfElements        = OpenGLNumberOfElements(ve.VertexElementFormat),
                            VertexAttribPointerType = OpenGLVertexAttribPointerType(ve.VertexElementFormat),
                            Normalized              = OpenGLVertexAttribNormalized(ve),
                        });
                        attrInfo.EnabledAttributes[attributeLocation] = true;
                    }
                }

                shaderAttributeInfo.Add(shaderHash, attrInfo);
            }

            // Apply the vertex attribute info
            foreach (VertexDeclarationAttributeInfo.Element element in attrInfo.Elements)
            {
                OpenGLDevice.Instance.AttributeEnabled[element.AttributeLocation] = true;
                OpenGLDevice.Instance.Attributes[element.AttributeLocation].Divisor.Set(divisor);
                OpenGLDevice.Instance.VertexAttribPointer(
                    element.AttributeLocation,
                    element.NumberOfElements,
                    element.VertexAttribPointerType,
                    element.Normalized,
                    VertexStride,
                    (IntPtr)(offset.ToInt64() + element.Offset)
                    );
            }
        }
예제 #5
0
        internal void Apply(Shader shader, IntPtr offset)
        {
            VertexDeclarationAttributeInfo attrInfo;
            int shaderHash = shader.GetHashCode();

            if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo))
            {
                // Get the vertex attribute info and cache it
                attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes);

                foreach (var ve in _elements)
                {
                    var attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex);
                    // XNA appears to ignore usages it can't find a match for, so we will do the same
                    if (attributeLocation >= 0)
                    {
                        attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element()
                        {
                            Offset                  = ve.Offset,
                            AttributeLocation       = attributeLocation,
                            NumberOfElements        = ve.VertexElementFormat.OpenGLNumberOfElements(),
                            VertexAttribPointerType = ve.VertexElementFormat.OpenGLVertexAttribPointerType(),
                            Normalized              = ve.OpenGLVertexAttribNormalized(),
                        });
                        attrInfo.EnabledAttributes[attributeLocation] = true;
                    }
                }

                shaderAttributeInfo.Add(shaderHash, attrInfo);
            }

            // Apply the vertex attribute info
            foreach (var element in attrInfo.Elements)
            {
                GL.VertexAttribPointer(element.AttributeLocation,
                                       element.NumberOfElements,
                                       element.VertexAttribPointerType,
                                       element.Normalized,
                                       this.VertexStride,
                                       (IntPtr)(offset.ToInt64() + element.Offset));
                GraphicsExtensions.CheckGLError();
            }
            GraphicsDevice.SetVertexAttributeArray(attrInfo.EnabledAttributes);
        }
		internal void Apply(Shader shader, IntPtr offset)
		{
            VertexDeclarationAttributeInfo attrInfo;
            int shaderHash = shader.GetHashCode();
            if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo))
            {
                // Get the vertex attribute info and cache it
                attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes);

                foreach (var ve in _elements)
                {
                    var attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex);
                    // XNA appears to ignore usages it can't find a match for, so we will do the same
                    if (attributeLocation >= 0)
                    {
                        attrInfo.Elements.Add(new VertexDeclarationAttributeInfo.Element()
                        {
                            Offset = ve.Offset,
                            AttributeLocation = attributeLocation,
                            NumberOfElements = ve.VertexElementFormat.OpenGLNumberOfElements(),
                            VertexAttribPointerType = ve.VertexElementFormat.OpenGLVertexAttribPointerType(),
                            Normalized = ve.OpenGLVertexAttribNormalized(),
                        });
                        attrInfo.EnabledAttributes[attributeLocation] = true;
                    }
                }

                shaderAttributeInfo.Add(shaderHash, attrInfo);
            }

            // Apply the vertex attribute info
            foreach (var element in attrInfo.Elements)
            {
                GL.VertexAttribPointer(element.AttributeLocation,
                    element.NumberOfElements,
                    element.VertexAttribPointerType,
                    element.Normalized,
                    this.VertexStride,
                    (IntPtr)(offset.ToInt64() + element.Offset));
                GraphicsExtensions.CheckGLError();
            }
            GraphicsDevice.SetVertexAttributeArray(attrInfo.EnabledAttributes);
		}
예제 #7
0
        internal void Apply(Shader shader, IntPtr offset, int divisor = 0)
        {
            List<Element> attrInfo;
            int shaderHash = shader.GetHashCode();
            if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo))
            {
                // Get the vertex attribute info and cache it
                attrInfo = new List<Element>(16); // 16, per XNA4 HiDef spec

                foreach (VertexElement ve in elements)
                {
                    int attributeLocation = shader.GetAttribLocation(ve.VertexElementUsage, ve.UsageIndex);

                    // XNA appears to ignore usages it can't find a match for, so we will do the same
                    if (attributeLocation >= 0)
                    {
                        attrInfo.Add(new Element()
                        {
                            Offset = ve.Offset,
                            AttributeLocation = attributeLocation,
                            NumberOfElements = GetNumberOfElements(ve.VertexElementFormat),
                            VertexAttribPointerType = ve.VertexElementFormat,
                            Normalized = GetVertexAttribNormalized(ve),
                        });
                    }
                }

                shaderAttributeInfo.Add(shaderHash, attrInfo);
            }

            // Apply the vertex attribute info
            foreach (Element element in attrInfo)
            {
                GraphicsDevice.GLDevice.AttributeEnabled[element.AttributeLocation] = true;
                GraphicsDevice.GLDevice.Attributes[element.AttributeLocation].Divisor = divisor;
                GraphicsDevice.GLDevice.VertexAttribPointer(
                    element.AttributeLocation,
                    element.NumberOfElements,
                    element.VertexAttribPointerType,
                    element.Normalized,
                    VertexStride,
                    (IntPtr) (offset.ToInt64() + element.Offset)
                );
            }
        }