private void Build(int width, int height, bool mipMap, RSurfaceFormat preferredFormat, RDepthFormat preferredDepthFormat, int preferredMultiSampleCount, bool shared) { var depth = 0; var stencil = 0; BackBuffer = new RTexture2D(); BackBuffer.Create(width, height, RPixelFormat.Rgba, preferredFormat); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, BackBuffer.Id, 0); if (preferredDepthFormat != RDepthFormat.None) { DepthBuffer = new RTexture2D(); if (preferredDepthFormat == RDepthFormat.Depth24Stencil8 || preferredDepthFormat == RDepthFormat.Depth32Stencil8) { DepthBuffer.CreateDepth(width, height, RPixelFormat.DepthStencil, preferredDepthFormat); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthStencilAttachment, TextureTarget.Texture2D, DepthBuffer.Id, 0); } else { DepthBuffer.CreateDepth(width, height, RPixelFormat.DepthComponent, preferredDepthFormat); GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2D, DepthBuffer.Id, 0); } REngine.CheckGLError(); } if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) { throw new Exception("Error creating frame buffer: framebuffer is not complete"); } }
public void Create(RPixelFormat format, ref RTexture2D posX, ref RTexture2D posY, ref RTexture2D posZ, ref RTexture2D negX, ref RTexture2D negY, ref RTexture2D negZ) { PixelInternalFormat inf = PixelInternalFormat.Rgba; PixelFormat pf = PixelFormat.Rgba; if (format == RPixelFormat.Bgr) { inf = PixelInternalFormat.Rgb; pf = PixelFormat.Bgr; } if (format == RPixelFormat.Rgb) { inf = PixelInternalFormat.Rgb; pf = PixelFormat.Rgb; } if (format == RPixelFormat.Bgra) { inf = PixelInternalFormat.Rgba; pf = PixelFormat.Bgra; } if (format == RPixelFormat.Rgba) { inf = PixelInternalFormat.Rgba; pf = PixelFormat.Rgba; } GL.ActiveTexture(TextureUnit.Texture0); var posXcolors = posX.GetData <RColor>(); var posYcolors = posY.GetData <RColor>(); var posZcolors = posZ.GetData <RColor>(); var negXcolors = negX.GetData <RColor>(); var negYcolors = negY.GetData <RColor>(); var negZcolors = negZ.GetData <RColor>(); Bounds = posX.Bounds; GL.GenTextures(1, out Id); textureTarget = OpenTK.Graphics.OpenGL.TextureTarget.TextureCubeMap; GL.BindTexture(textureTarget, Id); SetTextureMagFilter(RTextureMagFilter.Nearest); SetTextureMinFilter(RTextureMinFilter.Nearest); SetTextureWrapMode(RTextureWrapMode.ClampToBorder, RTextureWrapMode.ClampToBorder); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapPositiveX, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, posXcolors); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapPositiveY, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, posYcolors); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapPositiveZ, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, posZcolors); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapNegativeX, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, negXcolors); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapNegativeY, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, negYcolors); GL.TexImage2D <RColor>(TextureTarget.TextureCubeMapNegativeZ, 0, inf, Bounds.Width, Bounds.Height, 0, pf, PixelType.UnsignedByte, negZcolors); }
internal void Generate(Face face, int size, int dpi) { face.SetCharSize(0, new Fixed26Dot6(size), 0, (uint)dpi); Name = face.FamilyName; face.LoadChar((uint)32, (LoadFlags.Render | LoadFlags.Monochrome | LoadFlags.Pedantic), LoadTarget.Normal); SpaceWidth = face.Glyph.Metrics.HorizontalAdvance.ToInt32(); LineHeight = face.Height >> 6; Kerning = face.HasKerning; Size = size; Ascent = face.Ascender >> 6; Descent = face.Descender >> 6; Glyphs = new List <RFontGlyph>(); for (int i = 33; i < 126; i++) { uint charIndex = face.GetCharIndex((uint)i); face.LoadGlyph(charIndex, (LoadFlags.Render | LoadFlags.Color | LoadFlags.Pedantic | LoadFlags.CropBitmap), LoadTarget.Normal); if (face.Glyph.Bitmap.PixelMode == PixelMode.None) { continue; } RFontGlyph glyph = new RFontGlyph(); glyph.bitmap = face.Glyph.Bitmap.ToGdipBitmap(Color.White); glyph.Bounds = new Reactor.Math.Rectangle(0, 0, glyph.bitmap.Width, glyph.bitmap.Height); glyph.CharIndex = i; glyph.Offset = new Vector2(face.Glyph.Metrics.HorizontalBearingX.ToInt32(), face.Glyph.Metrics.HorizontalBearingY.ToInt32()); glyph.Advance = face.Glyph.Advance.X.ToInt32(); Glyphs.Add(glyph); } Glyphs.Sort(new FontGlyphSizeSorter()); var missed = -1; var width = 16; Bitmap b = new Bitmap(1, 1); while (missed != 0) { missed = 0; AtlasNode root = new AtlasNode(); root.bounds = new Reactor.Math.Rectangle(0, 0, width, width); b.Dispose(); b = new Bitmap(width, width); Graphics g = Graphics.FromImage(b); g.Clear(Color.Transparent); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; for (var i = 0; i < Glyphs.Count; i++) { RFontGlyph glyph = Glyphs[i]; AtlasNode result = root.Insert(glyph.Bounds); if (result != null) { Reactor.Math.Rectangle bounds = result.bounds; //g.DrawImageUnscaledAndClipped(glyph.bitmap, bounds); g.DrawImage(glyph.bitmap, bounds); glyph.Bounds = bounds; glyph.UVBounds = new Vector4((float)bounds.X, (float)bounds.Y, (float)bounds.Width, (float)bounds.Height); glyph.UVBounds /= (float)width; Glyphs[i] = glyph; } else { missed += 1; break; } } width += 16; } Texture = new RTexture2D(); Texture.LoadFromBitmap(b); Texture.SetTextureMagFilter(RTextureMagFilter.Linear); Texture.SetTextureMinFilter(RTextureMinFilter.LinearMipmapLinear); Texture.SetTextureWrapMode(RTextureWrapMode.ClampToBorder, RTextureWrapMode.ClampToBorder); REngine.CheckGLError(); }