// Draw the imgui triangle data void DrawTriangles(uint count, ImVector <ushort> idxBuffer, ImPtrVector <ImDrawVertPtr> idxVert, int idxOffset, int vtxOffset, IntPtr textureId) { uint texId = (uint)textureId; ushort index; ImDrawVertPtr vertex; if (Rlgl.rlCheckBufferLimit((int)count * 3)) { Rlgl.rlglDraw(); } Rlgl.rlPushMatrix(); Rlgl.rlBegin(Rlgl.RL_TRIANGLES); Rlgl.rlEnableTexture(texId); for (int i = 0; i <= (count - 3); i += 3) { index = idxBuffer[idxOffset + i]; vertex = idxVert[vtxOffset + index]; DrawTriangleVertex(vertex); index = idxBuffer[idxOffset + i + 2]; vertex = idxVert[vtxOffset + index]; DrawTriangleVertex(vertex); index = idxBuffer[idxOffset + i + 1]; vertex = idxVert[vtxOffset + index]; DrawTriangleVertex(vertex); } Rlgl.rlDisableTexture(); Rlgl.rlEnd(); Rlgl.rlPopMatrix(); }
void DrawTriangleVertex(ImDrawVertPtr idxVert) { Color c = GetColor(idxVert.col); Rlgl.rlColor4ub(c.r, c.g, c.b, c.a); Rlgl.rlTexCoord2f(idxVert.uv.X, idxVert.uv.Y); Rlgl.rlVertex2f(idxVert.pos.X, idxVert.pos.Y); }
unsafe void RenderCommandLists(ImDrawDataPtr drawData) { // Scale coordinates for retina displays (screen coordinates != framebuffer coordinates) int fbWidth = (int)(drawData.DisplaySize.X * drawData.FramebufferScale.X); int fbHeight = (int)(drawData.DisplaySize.Y * drawData.FramebufferScale.Y); // Avoid rendering if display is minimized or if the command list is empty if (fbWidth <= 0 || fbHeight <= 0 || drawData.CmdListsCount == 0) { return; } drawData.ScaleClipRects(ImGui.GetIO().DisplayFramebufferScale); Rlgl.rlDisableBackfaceCulling(); for (int n = 0; n < drawData.CmdListsCount; n++) { ImDrawListPtr cmdList = drawData.CmdListsRange[n]; // Vertex buffer and index buffer generated by Dear ImGui ImPtrVector <ImDrawVertPtr> vtxBuffer = cmdList.VtxBuffer; ImVector <ushort> idxBuffer = cmdList.IdxBuffer; for (int cmdi = 0; cmdi < cmdList.CmdBuffer.Size; cmdi++) { ImDrawCmdPtr pcmd = cmdList.CmdBuffer[cmdi]; if (pcmd.UserCallback != IntPtr.Zero) { // pcmd.UserCallback(cmdList, pcmd); } else { Vector2 pos = drawData.DisplayPos; int rectX = (int)((pcmd.ClipRect.X - pos.X) * drawData.FramebufferScale.X); int rectY = (int)((pcmd.ClipRect.Y - pos.Y) * drawData.FramebufferScale.Y); int rectW = (int)((pcmd.ClipRect.Z - rectX) * drawData.FramebufferScale.X); int rectH = (int)((pcmd.ClipRect.W - rectY) * drawData.FramebufferScale.Y); if (rectX < fbWidth && rectY < fbHeight && rectW >= 0.0f && rectH >= 0.0f) { Raylib.BeginScissorMode(rectX, rectY, rectW, rectH); DrawTriangles(pcmd.ElemCount, idxBuffer, vtxBuffer, (int)pcmd.IdxOffset, (int)pcmd.VtxOffset, pcmd.TextureId); } } } } Raylib.EndScissorMode(); Rlgl.rlEnableBackfaceCulling(); }
public void Update() { drawScreen.Update(); Raylib.BeginDrawing(); Raylib.BeginTextureMode(renderTexture); Raylib.ClearBackground(Color.BLACK); Raylib.BeginMode3D(camera); ModelRenderer.RenderQueue(); Raylib.EndMode3D(); Raylib.EndTextureMode(); Raylib.ClearBackground(Color.BLACK); //Console.WriteLine(renderTexture.depth.id); Raylib.BeginShaderMode(postProcessShader); Raylib.SetShaderValueTexture(postProcessShader, Raylib.GetShaderLocation(postProcessShader, "depthTexture"), renderTexture.depth); unsafe { Vector4 screenDims = new Vector4(screenWidth, screenHeight, windowWidth, windowHeight); IntPtr pointer = new IntPtr(&screenDims); Raylib.SetShaderValue( postProcessShader, Raylib.GetShaderLocation(postProcessShader, "screenSize"), pointer, ShaderUniformDataType.SHADER_UNIFORM_VEC4 ); } Raylib.DrawTexturePro( renderTexture.texture, new Rectangle(0, 0, renderTexture.texture.width, -renderTexture.texture.height), new Rectangle(0, 0, windowWidth, windowHeight), Vector2.Zero, 0, Color.WHITE ); Raylib.EndShaderMode(); drawScreen.Render(); Rlgl.rlDrawRenderBatchActive(); Raylib.EndDrawing(); Debug.Label("swap window"); }
public static RenderTexture2D LoadRenderTexture(int width, int height) { RenderTexture2D target = new RenderTexture2D(); target.id = Rlgl.rlLoadFramebuffer(width, height); // Load an empty framebuffer if (target.id > 0) { Rlgl.rlEnableFramebuffer(target.id); // Create color texture (default to RGBA) target.texture.id = Rlgl.rlLoadTexture(IntPtr.Zero, width, height, PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1); target.texture.width = width; target.texture.height = height; target.texture.format = PixelFormat.PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; target.texture.mipmaps = 1; // Create depth renderbuffer/texture target.depth.id = Rlgl.rlLoadTextureDepth(width, height, false); target.depth.width = width; target.depth.height = height; target.depth.format = (PixelFormat)19; //DEPTH_COMPONENT_24BIT? target.depth.mipmaps = 1; // Attach color texture and depth renderbuffer/texture to FBO Rlgl.rlFramebufferAttach(target.id, target.texture.id, FramebufferAttachType.RL_ATTACHMENT_COLOR_CHANNEL0, FramebufferAttachTextureType.RL_ATTACHMENT_TEXTURE2D, 0); Rlgl.rlFramebufferAttach(target.id, target.depth.id, FramebufferAttachType.RL_ATTACHMENT_DEPTH, FramebufferAttachTextureType.RL_ATTACHMENT_TEXTURE2D, 0); // Check if fbo is complete with attachments (valid) //if (Rlgl.rlFramebufferComplete(target.id)) TRACELOG(LOG_INFO, "FBO: [ID %i] Framebuffer object created successfully", target.id); Rlgl.rlDisableFramebuffer(); } //else TRACELOG(LOG_WARNING, "FBO: Framebuffer object can not be created"); return(target); }