public Material Clone() { var m = new Material(Shader); m._values = new Dictionary<string, object>(_values); m.Name = Name; return m; }
private static void LoadMaterials(XmlNode main) { XmlNode material = main.SelectSingleNode("Materials"); XmlNodeList materials = material.SelectNodes("Material"); string basePath = material.Attributes["basePath"].Value; foreach (XmlNode item in materials) { string name = item.Attributes["gameName"].Value; string vshader = item.Attributes["vshader"].Value; string fshader = item.Attributes["fshader"].Value; XmlNodeList @params = item.SelectNodes("Param"); Shader shader = new Shader(); shader.LoadVertexFile(basePath + "//" + vshader); shader.LoadFragmentFile(basePath + "//" + fshader); shader.Link(); Material mat = new Material(shader); foreach (XmlNode param in @params) { string paramName = param.Attributes["name"].Value; string paramType = param.Attributes["type"].Value; string paramValue = param.Attributes["value"].Value; mat.SetParameter(paramName, paramType, paramValue); } _materials[name] = mat; } }
public SpriteBatch() { dipQueue = new Queue<SpriteBatch.BatchItem>(25); vbuffer = new VertexBuffer(1024); Diagnostics.DiagnosticsCenter.Instance.Add(vbuffer); Shader defaultShader = new Shader(); defaultMaterial = new Material (defaultShader); if (Shader.Version < 3.3f) { defaultShader.LoadVertexSource(@"#version 120 uniform mat4 WPV; attribute vec2 vposition; attribute vec4 vcolor; attribute vec2 vtexcoord; varying vec4 fcolor; varying vec2 ftexcoord; void main(void) { fcolor = vcolor; ftexcoord = vtexcoord; gl_Position = WPV * vec4(vposition, 0, 1); }"); defaultShader.LoadFragmentSource(@"#version 120 uniform sampler2D colorTexture; varying vec4 fcolor; varying vec2 ftexcoord; void main(void) { gl_FragColor = texture2D(colorTexture, ftexcoord) * fcolor; }"); } else { defaultShader.LoadVertexSource(@"#version 330 core uniform mat4 WPV; in vec2 vposition; in vec4 vcolor; in vec2 vtexcoord; out vec4 fcolor; out vec2 ftexcoord; void main(void) { fcolor = vcolor; ftexcoord = vtexcoord; gl_Position = WPV * vec4(vposition, 0, 1); }"); defaultShader.LoadFragmentSource(@"#version 330 core uniform sampler2D colorTexture; in vec4 fcolor; in vec2 ftexcoord; out vec4 color; void main(void) { color = texture(colorTexture, ftexcoord) * fcolor; }"); } defaultShader.Link(); BindShader(defaultShader, "vposition", "vcolor", "vtexcoord"); int[] p = new int[4]; GL.GetInteger(GetPName.Viewport, p); proj = Matrix4.CreateOrthographicOffCenter(p[0], p[2], p[3], p[1], 1, -1); pixelTex = new Texture(); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.GenerateMipmap, 0); float[] pix = new float[] { 1.0f, 1.0f, 1.0f, 1.0f }; GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 1, 1, 0, PixelFormat.Bgra, PixelType.Float, pix); }
public void DrawTexture(Texture texture, Material material, RectangleF destinationRectangle, Color4 color) { DrawTexture(texture, material, destinationRectangle.X, destinationRectangle.Y, destinationRectangle.Width, destinationRectangle.Height, RectangleF.Empty, color); }
public void End() { if (!began) throw new Exception("Call begin first"); if (current == null) { current = defaultMaterial; } if (dipQueue.Count != 0) { vbuffer.Bind(); vbuffer.UpdateVertexBuffer(); vbuffer.UpdateIndexBuffer(); do { var b = dipQueue.Dequeue(); int count = (dipQueue.Count > 0 ? dipQueue.Peek().startIndex : vbuffer.IndexOffset) - b.startIndex; Material material = b.material; if (material == null) { material = defaultMaterial; } if (current != material) { current = material; ResetShader(current.Shader); } Matrix4 m = trans * proj; current.SetParameter("WPV", m); current.SetShaderUniforms(); //GL.BindTexture(TextureTarget.Texture2D, b.texture); b.texture.Bind(0); FlushBuffer(b.mode, b.startIndex, count); elementsCounter += count; } while (dipQueue.Count > 0); last = new SpriteBatch.BatchItem() { texture = null, startIndex = -1, mode = BeginMode.Triangles }; } began = false; }
public void DrawTexture(Texture texture, Material material, Vector2 position, RectangleF sourceRectangle, Color4 color) { DrawTexture(texture, material, position.X, position.Y, sourceRectangle, color); }
public void DrawTexture(Texture texture, Material material, Vector2 position, Color4 color) { DrawTexture(texture, material, position.X, position.Y, RectangleF.Empty, color); }
public void DrawTexture(Texture texture, Material material, RectangleF destinationRectangle, RectangleF sourceRectangle, Color4 color, float rotation, Vector2 origin, bool flipHorizontally = false, bool flipVertically = false) { DrawTexture(texture, material, destinationRectangle.X, destinationRectangle.Y, destinationRectangle.Width, destinationRectangle.Height, sourceRectangle, color, rotation, origin.X, origin.Y, flipHorizontally, flipVertically); }
public void DrawTexture(Texture texture, Material material, Vector2 position, RectangleF sourceRectangle, Color4 color, float rotation, Vector2 origin, Vector2 scale, bool flipHorizontally = false, bool flipVertically = false) { DrawTexture(texture, material, position.X, position.Y, sourceRectangle, color, rotation, origin.X, origin.Y, scale.X, scale.Y, flipHorizontally, flipVertically); }
public void DrawTexture(Texture texture, Material material, float x, float y, RectangleF sourceRectangle, Color4 color, float rotation = 0.0f, float xOrigin = 0.5f, float yOrigin = 0.5f, float xScale = 1, float yScale = 1, bool flipHorizontally = false, bool flipVertically = false) { DrawTexture(texture,material, x, y, sourceRectangle != RectangleF.Empty ? sourceRectangle.Width * xScale : texture.Size.Width * xScale, sourceRectangle != RectangleF.Empty ? sourceRectangle.Height * yScale : texture.Size.Height * yScale, sourceRectangle, color, rotation, xOrigin, yOrigin, flipHorizontally, flipVertically); }
public unsafe void DrawTexture(Texture texture, Material material, float x, float y, float width, float height, RectangleF sourceRectangle, Color4 color, float rotation = 0.0f, float xOrigin = 0.5f, float yOrigin = 0.5f, bool flipHorizontally = false, bool flipVertically = false) { if (texture == null) throw new ArgumentException("texture"); TryPush(texture, material, BeginMode.Triangles); if (sourceRectangle.IsEmpty) { tempRect.X = 0; tempRect.Y = 0; tempRect.Width = texture.Size.Width; tempRect.Height = texture.Size.Height; } else tempRect = sourceRectangle; texCoordTL = texture.GetTextureCoordinate(new Vector2(tempRect.X, tempRect.Y)); texCoordBR = texture.GetTextureCoordinate(new Vector2(tempRect.Right, tempRect.Bottom)); if (flipVertically) { float temp = texCoordBR.Y; texCoordBR.Y = texCoordTL.Y; texCoordTL.Y = temp; } if (flipHorizontally) { float temp = texCoordBR.X; texCoordBR.X = texCoordTL.X; texCoordTL.X = temp; } #region Add vertices float dx = -xOrigin * width; float dy = -yOrigin * height; float sin = 0; float cos = 1; if (rotation != 0) { sin = (float)Math.Sin(rotation); cos = (float)Math.Cos(rotation); } int offset = vbuffer.VertexOffset / vbuffer.Stride; int* ind = vbuffer.GetIndexPointerToFill(6); float* vert = vbuffer.GetVertexPointerToFill(4); *(ind++) = offset; *(ind++) = offset + 1; *(ind++) = offset + 2; *(ind++) = offset; *(ind++) = offset + 2; *(ind++) = offset + 3; *(vert++) = x + dx * cos - dy * sin; *(vert++) = y + dx * sin + dy * cos; *(vert++) = color.R; *(vert++) = color.G; *(vert++) = color.B; *(vert++) = color.A; *(vert++) = texCoordTL.X; *(vert++) = texCoordTL.Y; *(vert++) = x + (dx + width) * cos - dy * sin; *(vert++) = y + (dx + width) * sin + dy * cos; *(vert++) = color.R; *(vert++) = color.G; *(vert++) = color.B; *(vert++) = color.A; *(vert++) = texCoordBR.X; *(vert++) = texCoordTL.Y; *(vert++) = x + (dx + width) * cos - (dy + height) * sin; *(vert++) = y + (dx + width) * sin + (dy + height) * cos; *(vert++) = color.R; *(vert++) = color.G; *(vert++) = color.B; *(vert++) = color.A; *(vert++) = texCoordBR.X; *(vert++) = texCoordBR.Y; *(vert++) = x + dx * cos - (dy + height) * sin; *(vert++) = y + dx * sin + (dy + height) * cos; *(vert++) = color.R; *(vert++) = color.G; *(vert++) = color.B; *(vert++) = color.A; *(vert++) = texCoordTL.X; *(vert++) = texCoordBR.Y; #endregion Add vertices }
private bool TryPush(Texture tex, Material material, BeginMode mode) { if (last.texture != tex || last.mode != mode || last.material != material) { last = new BatchItem() { texture = tex, mode = mode, startIndex = vbuffer.IndexOffset, material = material }; dipQueue.Enqueue(last); return true; } return false; }