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 ); } }
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) ); } }
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) { 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); }
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) ); } }