public void Render(QbModel model) { ssao_geometryDepth.UseShader(); geometryBuffer.BindFBOWritting(); ssao_geometryDepth.WriteUniform("gWVP", camera.modelviewprojection); ssao_geometryDepth.WriteUniform("gWV", camera.view); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); model.Render(); ssao.UseShader(); geometryBuffer.BindFBOReading(TextureUnit.Texture1); SSAOBuffer.BindFBOWritting(); GL.Clear(ClearBufferMask.ColorBufferBit); GL.BindBuffer(BufferTarget.ArrayBuffer, quadBuffer); GL.EnableVertexAttribArray(0); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, 0); GL.DrawArrays(PrimitiveType.Quads, 0, 4); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); ssao_voxel.UseShader(); SSAOBuffer.BindFBOReading(TextureUnit.Texture2); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); ssao_voxel.WriteUniform("modelview", camera.modelviewprojection); model.Render(ssao_voxel); }
public SSAO(int width, int height, Camera camera) : base() { this.camera = camera; random = new Random(); geometryBuffer = new IOBuffer(width, height, true, PixelInternalFormat.Rgb32f); SSAOBuffer = new IOBuffer(width, height, false, PixelInternalFormat.R32f); ssao_geometryDepth = ShaderUtil.CreateShader("ssao_geometryDepth", "./data/shaders/SSAO_geometry.vs", "./data/shaders/SSAO_geometry.fs"); ssao = ShaderUtil.CreateShader("ssao", "./data/shaders/SSAO_pass.vs", "./data/shaders/SSAO_pass.fs"); ssao_voxel = ShaderUtil.CreateShader("qb", "./data/shaders/SSAO_voxel.vs", "./data/shaders/SSAO_voxel.fs"); ssao.WriteUniform("gSampleRad", 1.25f); ssao.WriteUniform("gProj", camera.projection); ssao.WriteUniform("gPositionMap", 1); ssao_voxel.WriteUniform("gScreenSize", new Vector2(width, height)); ssao_voxel.WriteUniform("gAOMap", 2); Vector3[] kernel = new Vector3[8]; for (uint i = 0; i < kernel.Length; i++) { float scale = (float)i / (float)(kernel.Length); Vector3 v; v.X = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f; v.Y = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f; v.Z = 2.0f * (float)random.Next(0x7fff) / 0x7fff - 1.0f; v *= (0.1f + 0.9f * scale * scale); kernel[i] = v; } unsafe { fixed(float *pointer = &kernel[0].X) { ssao.WriteUniformArray("gKernel", kernel.Length, pointer); } } quadBuffer = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, quadBuffer); GL.EnableVertexAttribArray(0); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, 0); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * quadData.Length), quadData, BufferUsageHint.StaticDraw); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); }
public override void Render(float x, float y, float width, float height) { quadInterpolation.UseShader(); quadInterpolation.WriteUniform("mvp", Matrix4.CreateOrthographicOffCenter(-1f, 1f, -1f, 1f, -1, 1)); data[0] = x; data[1] = y; data[2] = 0; data[3] = 1; data[4] = colors[0].R; data[5] = colors[0].G; data[6] = colors[0].B; data[7] = x + width; data[8] = y; data[9] = 1; data[10] = 1; data[11] = colors[1].R; data[12] = colors[1].G; data[13] = colors[1].B; data[14] = x + width; data[15] = y + height; data[16] = 1; data[17] = 0; data[18] = colors[2].R; data[19] = colors[2].G; data[20] = colors[2].B; data[21] = x; data[22] = y + height; data[23] = 0; data[24] = 0; data[25] = colors[3].R; data[26] = colors[3].G; data[27] = colors[3].B; GL.BindBuffer(BufferTarget.ArrayBuffer, bufferID); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * data.Length), data, BufferUsageHint.DynamicDraw); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindVertexArray(arrayID); GL.DrawArrays(PrimitiveType.Quads, 0, 4); GL.BindVertexArray(0); ShaderUtil.ResetShader(); }
public void render(Shader shader) { if (Visible && Singleton <Raycaster> .INSTANCE.lastHit.distance != 10000) { shader.WriteUniform("highlight", new Vector3(1, 1, 1)); unsafe { fixed(float *pointer = &color.R) { shader.WriteUniformArray("colors", 1, pointer); } } GL.BindVertexArray(vertexArray); GL.DrawArrays(PrimitiveType.Quads, 0, 4); GL.BindVertexArray(0); } }
public void RenderAll(Shader shader) { if (!Visible) { return; } shader.WriteUniform("highlight", new Vector3(highlight.R, highlight.G, highlight.B)); unsafe { fixed(float *pointer = &colors[0].R) { ShaderUtil.GetShader("qb").WriteUniformArray("colors", colorIndex, pointer); } } front.Render(shader); back.Render(shader); top.Render(shader); bottom.Render(shader); left.Render(shader); right.Render(shader); }
public void Render(Shader shader) { shader.WriteUniform("light", lightscale); vBuffer.Render(); }
public void write(string path, string name, QbModel model) { Client.OpenGLContextThread.Add(() => { int Wwidth = Client.window.Width; int Wheight = Client.window.Height; int framebuffer = GL.GenBuffer(); GL.BindFramebuffer(FramebufferTarget.FramebufferExt, framebuffer); int color = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, color); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, Wwidth, Wheight, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero); GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, color, 0); int depth = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2D, depth); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.DepthComponent24, Wwidth, Wheight, 0, PixelFormat.DepthComponent, PixelType.UnsignedByte, IntPtr.Zero); GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, TextureTarget.Texture2D, depth, 0); GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); GL.BindFramebuffer(FramebufferTarget.FramebufferExt, framebuffer); GL.DrawBuffers(1, new DrawBuffersEnum[] { DrawBuffersEnum.ColorAttachment0 }); GL.ClearColor(0, 0, 0, 0); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); int minx = 10000; int miny = 10000; int minz = 10000; int maxx = 0; int maxy = 0; int maxz = 0; int sizex = 0; int sizey = 0; int sizez = 0; foreach (var matrix in model.matrices) { if (!matrix.Visible) { continue; } if (matrix.minx < minx) { minx = matrix.minx; } if (matrix.maxx > maxx) { maxx = matrix.maxx; } if (matrix.miny < miny) { miny = matrix.miny; } if (matrix.maxy > maxy) { maxy = matrix.maxy; } if (matrix.minz < minz) { minz = matrix.minz; } if (matrix.maxz > maxz) { maxz = matrix.maxz; } } sizex = maxx - minx; sizey = maxy - miny; sizez = maxz - minz; float backup = 0; if (sizey * 1.5f > 20) { backup = sizey * 1.5f; } else if (sizex * 1.5f > 20) { backup = sizex * 1.5f; } else { backup = 20; } var centerpos = new Vector3((minx + ((maxx - minx) / 2)), (miny + ((maxy - miny) / 2)), (minz + ((maxz - minz) / 2))); var position = centerpos + new Vector3(.5f, sizey * .65f, backup); Vector3 direction; Vector3.Subtract(ref centerpos, ref position, out direction); direction.Normalize(); var cameraright = Vector3.Cross(direction, VectorUtils.UP); var cameraup = Vector3.Cross(cameraright, direction); var view = Matrix4.LookAt(position, position + direction, cameraup); var modelviewprojection = view * Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(45), (float)Wwidth / (float)Wheight, 1, 300); Shader voxelShader = ShaderUtil.GetShader("qb"); voxelShader.UseShader(); voxelShader.WriteUniform("modelview", modelviewprojection); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); model.RenderAll(voxelShader); string fullpath = Path.Combine(path, name + extension); using (FileStream f = new FileStream(fullpath, FileMode.OpenOrCreate)) { var bit = Screenshot.ScreenShot(ReadBufferMode.ColorAttachment0); bit = cropImage(bit, new Rectangle(Wwidth / 4, 0, Wwidth - ((Wwidth / 4) * 2), Wheight)); bit = bit.ResizeImage(ResizeKeepAspect(bit.Size, 400, 400)); byte[] buffer = new byte[0]; using (MemoryStream m = new MemoryStream()) { bit.Save(m, System.Drawing.Imaging.ImageFormat.Png); buffer = m.ToArray(); } using (BinaryWriter w = new BinaryWriter(f)) { w.Write(version); w.Write((int)buffer.Length); w.Write(buffer); // note - just in case i allow extending the color pattet // which i probably will w.Write(colorpalletflag); for (int i = 0; i < 10; i++) { var c = Singleton <GUI> .INSTANCE.Get <EmptyWidget>(GUIID.START_COLOR_SELECTORS + i).appearence.Get <PlainBackground>("background").color; w.Write(c.R); w.Write(c.G); w.Write(c.B); } w.Write(model.version); w.Write(model.colorFormat); w.Write(model.zAxisOrientation); w.Write(model.compressed); w.Write(model.visibilityMaskEncoded); w.Write((uint)model.matrices.Count); for (int i = 0; i < model.numMatrices; i++) { QbMatrix m = model.matrices[i]; if (!m.Visible) { continue; } int startx = Math.Min(0, m.minx); int starty = Math.Min(0, m.miny); int startz = Math.Min(0, m.minz); int width = (int)(Math.Abs(Math.Min(0, m.minx)) + m.maxx + 1); int height = (int)(Math.Abs(Math.Min(0, m.miny)) + m.maxy + 1); int length = (int)(Math.Abs(Math.Min(0, m.minz)) + m.maxz + 1); if (width < m.size.X) { width = (int)m.size.X; } if (height < m.size.Y) { height = (int)m.size.Y; } if (length < m.size.Z) { length = (int)m.size.Z; } w.Write(m.name); w.Write((uint)width); w.Write((uint)height); w.Write((uint)length); w.Write((int)m.position.X); w.Write((int)m.position.Y); w.Write((int)m.position.Z); if (model.compressed == 0) { Voxel voxel; for (int z = startz; z < startz + length; z++) { for (int y = starty; y < starty + height; y++) { for (int x = startx; x < startx + width; x++) { int zz = model.zAxisOrientation == (int)0 ? z : (int)(length - z - 1); if (m.voxels.TryGetValue(m.GetHash(x, y, zz), out voxel)) { Colort c = m.colors[voxel.colorindex]; w.Write((byte)(c.R * 255)); w.Write((byte)(c.G * 255)); w.Write((byte)(c.B * 255)); w.Write(voxel.alphamask); } else { w.Write((byte)0); w.Write((byte)0); w.Write((byte)0); w.Write((byte)0); } } } } } } } GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0); GL.DeleteTexture(color); GL.DeleteTexture(depth); GL.DeleteFramebuffer(framebuffer); } }); }
public void RenderAll(Shader shader) { if (!Visible) return; shader.WriteUniform("highlight", new Vector3(highlight.R, highlight.G, highlight.B)); unsafe { fixed (float* pointer = &colors[0].R) { ShaderUtil.GetShader("qb").WriteUniformArray("colors", colorIndex, pointer); } } front.Render(shader); back.Render(shader); top.Render(shader); bottom.Render(shader); left.Render(shader); right.Render(shader); }
public void Render(Shader shader) { if (!Visible) return; //foreach(var c in voxels.Values) //{ //// Debug.Print(c.front.ToString()); //// Debug.Print(c.back.ToString()); //// Debug.Print(c.left.ToString()); //// Debug.Print(c.right.ToString()); // Debug.Print(c.top.ToString()); // //Debug.Print(c.bottom.ToString()); //} while (modifiedvoxels.Count > 0) { if (modifiedvoxels.TryPop(out modified)) { switch (modified.action) { case VoxleModifierAction.NONE: break; case VoxleModifierAction.ADD: break; case VoxleModifierAction.REMOVE: break; case VoxleModifierAction.RECOLOR: break; } } } shader.WriteUniform("highlight", new Vector3(highlight.R, highlight.G, highlight.B)); unsafe { fixed (float* pointer = &colors[0].R) { ShaderUtil.GetShader("qb").WriteUniformArray("colors", colorIndex, pointer); } } if (RayIntersectsPlane(ref front.normal, ref Singleton<Camera>.INSTANCE.direction)) { front.Render(shader); } if (RayIntersectsPlane(ref back.normal, ref Singleton<Camera>.INSTANCE.direction)) { back.Render(shader); } if (RayIntersectsPlane(ref top.normal, ref Singleton<Camera>.INSTANCE.direction)) { top.Render(shader); } if (RayIntersectsPlane(ref bottom.normal, ref Singleton<Camera>.INSTANCE.direction)) { bottom.Render(shader); } if (RayIntersectsPlane(ref left.normal, ref Singleton<Camera>.INSTANCE.direction)) { left.Render(shader); } if (RayIntersectsPlane(ref right.normal, ref Singleton<Camera>.INSTANCE.direction)) { right.Render(shader); } }
public void Render(Shader shader) { if (!Visible) { return; } //foreach(var c in voxels.Values) //{ //// Debug.Print(c.front.ToString()); //// Debug.Print(c.back.ToString()); //// Debug.Print(c.left.ToString()); //// Debug.Print(c.right.ToString()); // Debug.Print(c.top.ToString()); // //Debug.Print(c.bottom.ToString()); //} while (modifiedvoxels.Count > 0) { if (modifiedvoxels.TryPop(out modified)) { switch (modified.action) { case VoxleModifierAction.NONE: break; case VoxleModifierAction.ADD: break; case VoxleModifierAction.REMOVE: break; case VoxleModifierAction.RECOLOR: break; } } } shader.WriteUniform("highlight", new Vector3(highlight.R, highlight.G, highlight.B)); unsafe { fixed(float *pointer = &colors[0].R) { ShaderUtil.GetShader("qb").WriteUniformArray("colors", colorIndex, pointer); } } if (RayIntersectsPlane(ref front.normal, ref Singleton <Camera> .INSTANCE.direction)) { front.Render(shader); } if (RayIntersectsPlane(ref back.normal, ref Singleton <Camera> .INSTANCE.direction)) { back.Render(shader); } if (RayIntersectsPlane(ref top.normal, ref Singleton <Camera> .INSTANCE.direction)) { top.Render(shader); } if (RayIntersectsPlane(ref bottom.normal, ref Singleton <Camera> .INSTANCE.direction)) { bottom.Render(shader); } if (RayIntersectsPlane(ref left.normal, ref Singleton <Camera> .INSTANCE.direction)) { left.Render(shader); } if (RayIntersectsPlane(ref right.normal, ref Singleton <Camera> .INSTANCE.direction)) { right.Render(shader); } }
public void Render(QbModel model) { switch (wireFrameType) { case WireframeType.WireframeBlack: if (drawWireframe) { GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(1); wireframeShader.UseShader(); wireframeShader.WriteUniform("vHSV", new Vector3(1, 0f, 0)); wireframeShader.WriteUniform("modelview", camera.modelviewprojection); model.getactivematrix.RenderAll(wireframeShader); } GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(2); voxelShader.UseShader(); voxelShader.WriteUniform("modelview", camera.modelviewprojection); selection.render(voxelShader); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); model.RenderAll(voxelShader); break; case WireframeType.WireframeColorMatch: if (drawWireframe) { GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(1); wireframeShader.UseShader(); wireframeShader.WriteUniform("vHSV", new Vector3(1, 1.1f, 1.1f)); wireframeShader.WriteUniform("modelview", camera.modelviewprojection); model.getactivematrix.RenderAll(wireframeShader); } GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(2); voxelShader.UseShader(); voxelShader.WriteUniform("modelview", camera.modelviewprojection); selection.render(voxelShader); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); model.RenderAll(voxelShader); break; case WireframeType.SmartOutline: if (drawWireframe) { GL.CullFace(CullFaceMode.Front); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(2); wireframeShader.UseShader(); wireframeShader.WriteUniform("vHSV", new Vector3(1, 1.5f, 1.0f)); wireframeShader.WriteUniform("modelview", camera.modelviewprojection); model.getactivematrix.RenderAll(wireframeShader); } GL.CullFace(CullFaceMode.Back); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(2); voxelShader.UseShader(); voxelShader.WriteUniform("modelview", camera.modelviewprojection); selection.render(voxelShader); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); model.RenderAll(voxelShader); break; } }