Beispiel #1
0
        // 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();
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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();
        }
Beispiel #4
0
        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");
        }
Beispiel #5
0
        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);
        }