Exemplo n.º 1
0
 public ForwardRenderPipeline()
 {
     framebuffer_color = Ogl.GenFramebuffer("Forward Color");
     Ogl.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer_color);
     Ogl.DrawBuffer(DrawBufferMode.ColorAttachment0);
     Ogl.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
 }
Exemplo n.º 2
0
        internal void UpdateTexturesOfCurrentModel(Dictionary <Material, Image> snapshot)
        {
            void updateTextures(Renderer rndr)
            {
                foreach (var kvp in snapshot)
                {
                    if (kvp.Value != kvp.Key.Image)
                    {
                        rndr.UpdateTexture(kvp.Value, kvp.Key.Image);
                    }
                }
            }

            if (cVisualMap is object && Maps.rndrVisualMap is object)
            {
                updateTextures(rndrVisualMap);
            }

            foreach (var rndrObj in Main.ObjectModels.Values)
            {
                updateTextures(rndrObj);
            }

            Ogl.Invalidate();
        }
Exemplo n.º 3
0
        protected override void Draw(List <GizmoPoint> gizmoData)
        {
            if (gizmoData.Count == 0)
            {
                return;
            }

            if (data.Length < gizmoData.Count * 3)
            {
                Array.Resize(ref data, gizmoData.Count * 3);
            }

            int dataIndex = 0;

            for (int i = 0; i < gizmoData.Count; i++)
            {
                GizmoPoint gizmo = gizmoData[i];
                data[dataIndex++] = gizmo.Point.x;
                data[dataIndex++] = gizmo.Point.y;
                data[dataIndex++] = gizmo.Point.z;
            }

            //VBO config
            Ogl.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            Ogl.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * dataIndex, data, BufferUsageHint.StreamDraw);

            //VAO config
            Ogl.BindVertexArray(vao);
            Ogl.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, sizeof(float) * 3, 0);
            Ogl.EnableVertexAttribArray(0);

            Ogl.DrawArray(PrimitiveType.Points, 0, gizmoData.Count);
        }
Exemplo n.º 4
0
        protected override void OnResize(ResizeEventArgs e)
        {
            base.OnResize(e);

            AppScreen.Resolution = new Entygine.Mathematics.Vec2i(Size.X, Size.Y);

            Ogl.Viewport(0, 0, Size.X, Size.Y);
        }
Exemplo n.º 5
0
        internal void LoadAreaModel(ModelDrawMod modelMode)
        {
            if (Main.CArea is object)
            {
                Main.ProgressControl(true);
                switch (modelMode)
                {
                case ModelDrawMod.Collision:
                {
                    if (cCollisionMap is null)
                    {
                        LoadAreaCollisionAsObject3D();
                        rndrCollisionMap?.ReleaseBuffers();
                        rndrCollisionMap = null;
                    }

                    if (rndrCollisionMap is null)
                    {
                        rndrCollisionMap = new Renderer(cCollisionMap);
                        rndrCollisionMap.RenderModel();
                    }

                    break;
                }

                case ModelDrawMod.VisualMap:
                {
                    if (cVisualMap is null)
                    {
                        LoadAreaVisualMapAsObject3D();
                        rndrVisualMap?.ReleaseBuffers();
                        rndrVisualMap = null;
                    }

                    if (rndrVisualMap is null)
                    {
                        rndrVisualMap = new Renderer(cVisualMap);
                        rndrVisualMap.RenderModel();
                    }

                    break;
                }
                }

                Ogl.Invalidate();
                Main.ProgressControl(false);

                // Console.WriteLine("Done!")
            }
        }
Exemplo n.º 6
0
        private static void RenderEditor(FrameEventArgs e)
        {
            imgui.Update(mainWindow.KeyboardState, mainWindow.MouseState, (float)e.Time);

            Ogl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit);
            Ogl.ClearColor(0.1f, 0.1f, 0.1f, 255);

            EntygineApp.RenderFrame(e);

            Ogl.Viewport(0, 0, mainWindow.Size.X, mainWindow.Size.Y);
            imgui.WindowResized(mainWindow.Size.X, mainWindow.Size.Y);

            mainEditorDrawer.Draw();

            imgui.Render();
        }
Exemplo n.º 7
0
        public void CreateDeviceResources()
        {
            vertexBufferSize = 100_000;
            indexBufferSize  = 20_000;

            vao = Ogl.GenVertexArray("Dear IMGUI");
            Ogl.BindVertexArray(vao);

            vertexBuffer = Ogl.GenBuffer("Dear IMGUI - Vertex Buffer");
            indexBuffer  = Ogl.GenBuffer("Dear IMGUI - Index Buffer");

            Ogl.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer);
            Ogl.BufferData(BufferTarget.ArrayBuffer, vertexBufferSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);
            //Ogl.NamedBufferData(vertexBuffer, vertexBufferSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);

            Ogl.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);
            Ogl.BufferData(BufferTarget.ElementArrayBuffer, indexBufferSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);
            //Ogl.NamedBufferData(indexBuffer, indexBufferSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);

            RecreateFontDeviceTexture();

            Shader shader = Shader.CreateShaderWithProgram(imgui_vert, imgui_frag, "ImGUI Shader");

            material = new Material(shader, fontTexture);
            material.LoadMaterial();

            Ogl.VertexArrayVertexBuffer(vao, 0, vertexBuffer, IntPtr.Zero, Unsafe.SizeOf <ImDrawVert>());
            Ogl.VertexArrayElementBuffer(vao, indexBuffer);

            Ogl.EnableVertexArrayAttrib(vao, 0);
            Ogl.VertexArrayAttribBinding(vao, 0, 0);
            Ogl.VertexArrayAttribFormat(vao, 0, 2, VertexAttribType.Float, false, 0);

            Ogl.EnableVertexArrayAttrib(vao, 1);
            Ogl.VertexArrayAttribBinding(vao, 1, 0);
            Ogl.VertexArrayAttribFormat(vao, 1, 2, VertexAttribType.Float, false, 8);

            Ogl.EnableVertexArrayAttrib(vao, 2);
            Ogl.VertexArrayAttribBinding(vao, 2, 0);
            Ogl.VertexArrayAttribFormat(vao, 2, 4, VertexAttribType.UnsignedByte, true, 16);
        }
Exemplo n.º 8
0
        public void Render(ref RenderContext context, CameraData[] cameras, Matrix4[] transforms)
        {
            context.CommandBuffer.QueueCommand(RenderCommandsLibrary.GenerateShadowMaps());

            for (int i = 0; i < cameras.Length; i++)
            {
                Matrix4    cameraTransform = transforms[i];
                CameraData camera          = cameras[i];

                context.CommandBuffer.QueueCommand(new RenderCommand("Bind color FBO", (ref RenderContext context) =>
                {
                    camera.Framebuffer.Bind();
                    //Ogl.BindFramebuffer(FramebufferTarget.Framebuffer, framebuffer_color);
                    //Ogl.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2D, camera.DepthTargetTexture.Handle, 0);
                    //Ogl.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0, TextureTarget.Texture2D, camera.ColorTargetTexture.handle, 0);
                    //FramebufferErrorCode status = Ogl.CheckFramebufferStatus(FramebufferTarget.Framebuffer);
                    //if (status != FramebufferErrorCode.FramebufferComplete)
                    //    DevTools.DevConsole.Log(DevTools.LogType.Error, status);

                    Ogl.Enable(EnableCap.DepthTest);
                    Ogl.Enable(EnableCap.CullFace);
                    Ogl.Enable(EnableCap.ProgramPointSize);
                    Ogl.Enable(EnableCap.Multisample);
                    Ogl.PointSize(10f);
                }));

                context.CommandBuffer.QueueCommand(RenderCommandsLibrary.DrawGeometry(camera, cameraTransform));
                context.CommandBuffer.QueueCommand(RenderCommandsLibrary.DrawGizmos(camera, cameraTransform));
                context.CommandBuffer.QueueCommand(RenderCommandsLibrary.DrawSkybox(camera, cameraTransform));

                context.CommandBuffer.QueueCommand(new RenderCommand("Unbind FBO", (ref RenderContext context) =>
                {
                    //TODO: Blit f*****g up at some point wtf
                    Framebuffer.Blit(camera.Framebuffer, camera.FinalFramebuffer, ClearBufferMask.ColorBufferBit);
                    Ogl.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
                }));
            }

            //context.CommandBuffer.QueueCommand(RenderCommandsLibrary.DrawUI());
        }
Exemplo n.º 9
0
        public static RenderCommand DrawUI()
        {
            return(new RenderCommand("Draw UI", (ref RenderContext context) =>
            {
                if (!context.TryGetData(out UICanvasRenderData canvasRenderData))
                {
                    return;
                }

                Ogl.Disable(EnableCap.CullFace);
                Ogl.Disable(EnableCap.DepthTest);

                Ogl.Enable(EnableCap.Blend);
                Ogl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);

                Matrix4 projection = canvasRenderData.Camera.CalculateProjection();

                List <UICanvas> canvases = canvasRenderData.GetCanvases();
                for (int i = 0; i < canvases.Count; i++)
                {
                    UICanvas canvas = canvases[i];
                    canvas.deltaTimeText.Text = $"{FrameContext.Current.count} frame - {FrameContext.Current.delta * 1000:F1}ms - {1 / FrameContext.Current.delta:F1}fps";

                    canvas.UpdateRenderers();
                    var renderables = canvas.GetRenderables();
                    for (int m = 0; m < renderables.Count; m++)
                    {
                        UI_IRenderable currRenderable = renderables[m];
                        currRenderable.Material.SetMatrix("projection", projection);
                        currRenderable.DrawUI(canvasRenderData.Mesh);
                    }
                }

                Ogl.Enable(EnableCap.CullFace);
                Ogl.Enable(EnableCap.DepthTest);
                Ogl.Disable(EnableCap.Blend);
            }));
Exemplo n.º 10
0
        public static RenderCommand DrawGeometry(CameraData camera, Matrix4 cameraTransform)
        {
            return(new RenderCommand("Draw Geometry", (ref RenderContext context) =>
            {
                if (!context.TryGetData(out GeometryRenderData geometryData))
                {
                    return;
                }

                if (!context.TryGetData(out LightsRenderData lightData))
                {
                    return;
                }

                //if (MainDevWindowGL.Window.KeyboardState.IsKeyDown(OpenTK.Windowing.GraphicsLibraryFramework.Keys.I))
                //    yaw += 0.1f;

                //if (MainDevWindowGL.Window.KeyboardState.IsKeyDown(OpenTK.Windowing.GraphicsLibraryFramework.Keys.O))
                //    yaw -= 0.1f;

                //if (MainDevWindowGL.Window.KeyboardState.IsKeyDown(OpenTK.Windowing.GraphicsLibraryFramework.Keys.K))
                //    pitch += 0.1f;

                //if (MainDevWindowGL.Window.KeyboardState.IsKeyDown(OpenTK.Windowing.GraphicsLibraryFramework.Keys.L))
                //    pitch -= 0.1f;

                Ogl.Viewport(0, 0, AppScreen.Resolution.x, AppScreen.Resolution.y);
                Ogl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

                Light mainLight = lightData.lights[0];
                Matrix4 projection = camera.CalculateProjection();

                List <MeshRenderGroup> renderGroups = geometryData.GetRenderGroups();
                for (int i = 0; i < renderGroups.Count; i++)
                {
                    MeshRenderGroup renderGroup = renderGroups[i];

                    RenderMesh pair = renderGroup.MeshRender;
                    List <Matrix4> positions = renderGroup.Transforms;

                    pair.mat.SetDepthMap(new DepthTexture(mainLight.Framebuffer.DepthBuffer));
                    GraphicsAPI.UseMeshMaterial(pair.mesh, pair.mat);


                    //Update camera pos for material
                    //TODO: Use 'Uniform buffer objects' to globally share this data
                    pair.mat.SetMatrix("view", cameraTransform);
                    pair.mat.SetMatrix("projection", projection);

                    pair.mat.SetVector3("directionalLight", new Vector3(1, 1, 1));
                    pair.mat.SetVector3("ambientLight", new Vector3(0.5f, 0.5f, 0.5f));
                    pair.mat.SetVector3("directionalDir", LIGHT_FORWARD_NORMALIZED);
                    pair.mat.SetMatrix("lightSpace", LIGHT_VIEW * mainLight.GetProjection());

                    for (int p = 0; p < positions.Count; p++)
                    {
                        pair.mat.SetMatrix("model", positions[p]);

                        GraphicsAPI.DrawTriangles(pair.mesh.GetIndiceCount());
                    }

                    GraphicsAPI.FreeMeshMaterial(pair.mesh, pair.mat);
                }
            }));
Exemplo n.º 11
0
 public GizmoLineOrder()
 {
     vao = Ogl.GenVertexArray("Gizmo - Lines");
     vbo = Ogl.GenBuffer("Gizmo Lines");
 }
Exemplo n.º 12
0
        internal void CheckAndLoadNew()
        {
            Ogl.MakeCurrent();
            bool loadAreaIDs = false;

            if (Main.CArea is null)
            {
                loadAreaIDs = true;
            }

            if (Main.CLevel.Areas.Count != Main.ComboBoxItem_Area.Items.Count)
            {
                loadAreaIDs = true;
            }
            else
            {
                foreach (ComboItem ci in Main.ComboBoxItem_Area.Items)
                {
                    if (!Main.CLevel.Areas.Contains((LevelArea)ci.Tag))
                    {
                        loadAreaIDs = true;
                    }
                }
            }

            if (loadAreaIDs)
            {
                Main.LoadAreaIDs();
            }
            else
            {
                bool loadAreaMdl = false;
                if (hashCollisionMap != Main.CArea.AreaModel.Collision.GetHashCode())
                {
                    hashCollisionMap = 0;
                    cCollisionMap    = null;
                    if (Ogl.CurrentModelDrawMod == ModelDrawMod.Collision)
                    {
                        loadAreaMdl = true;
                    }
                }

                if (hashVisualMap != Main.CArea.AreaModel.Fast3DBuffer.GetBuffer().GetHashCode())
                {
                    hashVisualMap = 0;
                    cVisualMap    = null;
                    if (Ogl.CurrentModelDrawMod == ModelDrawMod.VisualMap)
                    {
                        loadAreaMdl = true;
                    }
                }

                if (loadAreaMdl)
                {
                    Maps.LoadAreaModel();
                }
                else
                {
                    Ogl.Invalidate();
                }
            }
        }
Exemplo n.º 13
0
        public void ImportAreaModel(bool convertModel, bool convertCollision, string inputKey)
        {
            var res = PublicFunctions.GetModelViaModelConverter(loadVisualMapAsDefault: convertModel, loadCollisionAsDefault: convertCollision, inputsKey: inputKey);

            if (res is object)
            {
                Ogl.MakeCurrent();
                Main.SuspendLayout();
                {
                    var          withBlock    = Main.CArea;
                    HistoryPoint hp           = null;
                    var          OldAreaModel = withBlock.AreaModel;
                    if (res.Value.hasCollision && res.Value.hasVisualMap == true)
                    {
                        hp = HistoryPoint.FromObject(this, ObjectValueType.Field, new MemberWhiteList(new[] { "rndrVisualMap", "cVisualMap", "rndrCollisionMap", "cCollisionMap" }), BindingFlags.Instance | BindingFlags.NonPublic);
                        var os = new ObjectState();
                        os.Object       = Main.CArea;
                        os.ValueToPatch = withBlock.AreaModel;
                        os.MemberFlags  = BindingFlags.Instance | BindingFlags.Public;
                        os.MemberType   = ObjectValueType.Property;
                        os.MemberName   = "AreaModel";
                        hp.Entries.Add(os);
                        withBlock.AreaModel = res?.mdl;
                        withBlock.AreaModel.Collision.SpecialBoxes = OldAreaModel.Collision.SpecialBoxes;
                        cVisualMap    = null;
                        cCollisionMap = null;
                    }
                    else if (res.Value.hasCollision == true)
                    {
                        hp = HistoryPoint.FromObject(this, ObjectValueType.Field, new MemberWhiteList(new[] { "rndrCollisionMap", "cCollisionMap" }), BindingFlags.Instance | BindingFlags.NonPublic);
                        var os = new ObjectState();
                        os.Object       = Main.CArea.AreaModel;
                        os.ValueToPatch = withBlock.AreaModel.Collision;
                        os.MemberFlags  = BindingFlags.Instance | BindingFlags.Public;
                        os.MemberType   = ObjectValueType.Property;
                        os.MemberName   = "Collision";
                        hp.Entries.Add(os);
                        withBlock.AreaModel.Collision = res?.mdl.Collision;
                        withBlock.AreaModel.Collision.SpecialBoxes = OldAreaModel.Collision.SpecialBoxes;
                        cCollisionMap = null;
                    }
                    else if (res.Value.hasVisualMap == true)
                    {
                        hp = HistoryPoint.FromObject(this, ObjectValueType.Field, new MemberWhiteList(new[] { "rndrVisualMap", "cVisualMap" }), BindingFlags.Instance | BindingFlags.NonPublic);
                        var os = new ObjectState();
                        os.Object       = Main.CArea.AreaModel;
                        os.ValueToPatch = withBlock.AreaModel.Fast3DBuffer;
                        os.MemberFlags  = BindingFlags.Instance | BindingFlags.Public;
                        os.MemberType   = ObjectValueType.Property;
                        os.MemberName   = "Fast3DBuffer";
                        hp.Entries.Add(os);
                        withBlock.AreaModel           = res?.mdl;
                        withBlock.AreaModel.Collision = OldAreaModel.Collision;
                        cVisualMap = null;
                    }

                    if (res.Value.hasVisualMap == true)
                    {
                        withBlock.ScrollingTextures.Clear();
                        withBlock.ScrollingTextures.AddRange(withBlock.AreaModel.Fast3DBuffer.ConvertResult.ScrollingCommands.ToArray());
                        Main.Rommgr.RomConfig.GetLevelConfig(Main.CLevel.LevelID).GetLevelAreaConfig(withBlock.AreaID).ScrollingNames = res?.mdl.Fast3DBuffer.ConvertResult.ScrollingNames;
                    }

                    if (hp != null && hp.Entries.Any())
                    {
                        Main.history.Store(hp);
                    }
                }

                Main.CArea.SetSegmentedBanks(Main.Rommgr);
                LoadAreaModel();
                Main.ResumeLayout();
            }
            else
            {
                Ogl.MakeCurrent();
            }
        }
Exemplo n.º 14
0
        public static void LoadEngine()
        {
            if (loadedEngine)
            {
                return;
            }

            loadedEngine = true;

            Ogl.enableErrorCheck = true;

            InitConsole();

            DevConsole.Log(LogType.Info, "Creating Entity World...");

            coreWorker = new WorkerCycleCore();
            EntityWorld world = InitEcs();

            RenderPipelineCore.SetPipeline(new ForwardRenderPipeline());

            InitPhysics();
            InitSkybox();
            InitUI(world);
            InitLight();
            InitScene(world);

            DevConsole.Log(LogType.Info, "Entity world created.");

            Ogl.ClearColor(0.1f, 0.1f, 0.2f, 1.0f);
            Ogl.Enable(EnableCap.DepthTest);
            Ogl.Enable(EnableCap.CullFace);
            Ogl.Enable(EnableCap.ProgramPointSize);
            Ogl.PointSize(10f);

            EntityWorld InitEcs()
            {
                EntityWorld world = EntityWorld.CreateWorld();

                world.Runner.AssignToWorker(coreWorker).CreateSystemsAuto(world);
                EntityWorld.SetActive(world);
                return(world);
            }

            void InitPhysics()
            {
                PhysicsRunner physicsRunner = new PhysicsRunner();
                PhysicsWorld  world         = new PhysicsWorld();

                PhysicsWorld.SetDefaultWorld(world);
                physicsRunner.AddWorld(world);
                physicsRunner.AssignToWorker(coreWorker);
            }

            void InitScene(EntityWorld world)
            {
                Mesh   meshResource   = MeshPrimitives.CreateCube(1);
                Shader shaderResource = Shader.CreateShaderWithPath(AssetBrowser.Utilities.LocalToAbsolutePath(@"Shaders\standard.vert"),
                                                                    AssetBrowser.Utilities.LocalToAbsolutePath(@"Shaders\standard.frag"), "Standard Shader");

                Texture2D     texture          = new Texture2D(AssetBrowser.Utilities.LocalToAbsolutePath(@"Textures\Box.png"), "Box");
                Material      materialResource = new Material(shaderResource, texture);
                SC_RenderMesh renderMesh       = new SC_RenderMesh(meshResource, materialResource);

                EntityArchetype meshArchetype = new EntityArchetype(typeof(SC_RenderMesh), typeof(C_Transform), typeof(C_Position));
                EntityArchetype boxArchetype  = new EntityArchetype(typeof(SC_RenderMesh), typeof(C_Transform), typeof(C_Position), typeof(C_BoxTag));

                Entity planeEntity = world.EntityManager.CreateEntity(meshArchetype);

                world.EntityManager.SetComponent(planeEntity, new C_Position()
                {
                    value = new Vec3f(0, 0, 0)
                });
                //world.EntityManager.SetComponent(planeEntity, new C_PhysicsBody() { body = new PhysicBody() { isStatic = true } });
                Mesh     planeMesh     = MeshPrimitives.CreatePlaneXZ(50);
                Material planeMaterial = new Material(shaderResource, Texture2D.CreateWhiteTexture(64, 64));

                world.EntityManager.SetSharedComponent(planeEntity, new SC_RenderMesh(planeMesh, planeMaterial));

                Entity planeEntity2 = world.EntityManager.CreateEntity(meshArchetype);

                world.EntityManager.SetComponent(planeEntity2, new C_Position()
                {
                    value = new Vec3f(0, 5, -10)
                });
                //world.EntityManager.SetComponent(planeEntity2, new C_PhysicsBody() { body = new PhysicBody() { isStatic = true } });

                Mesh     planeMesh2     = MeshPrimitives.CreatePlaneXY(10);
                Material planeMaterial2 = new Material(shaderResource, texture);

                world.EntityManager.SetSharedComponent(planeEntity2, new SC_RenderMesh(planeMesh2, planeMaterial2));

                Entity boxEntity = world.EntityManager.CreateEntity(boxArchetype);

                world.EntityManager.SetComponent(boxEntity, new C_Position()
                {
                    value = new Vec3f(0, 2, 0)
                });
                //world.EntityManager.SetComponent(boxEntity, new C_PhysicsBody() { body = new PhysicBody() });
                world.EntityManager.SetSharedComponent(boxEntity, renderMesh);

                Entity boxEntity2 = world.EntityManager.CreateEntity(boxArchetype);

                world.EntityManager.SetComponent(boxEntity2, new C_Position()
                {
                    value = new Vec3f(2, 2, 0)
                });
                //world.EntityManager.SetComponent(boxEntity2, new C_PhysicsBody() { body = new PhysicBody() });
                world.EntityManager.SetSharedComponent(boxEntity2, renderMesh);

                Entity boxEntity3 = world.EntityManager.CreateEntity(boxArchetype);

                world.EntityManager.SetComponent(boxEntity3, new C_Position()
                {
                    value = new Vec3f(-2, 2, 0)
                });
                //world.EntityManager.SetComponent(boxEntity3, new C_PhysicsBody() { body = new PhysicBody() });

                world.EntityManager.SetSharedComponent(boxEntity3, renderMesh);

                EntityArchetype editorCameraArchetype = new EntityArchetype(typeof(C_Camera), typeof(C_Transform), typeof(C_EditorCamera));
                Entity          cameraEditorEntity    = world.EntityManager.CreateEntity(editorCameraArchetype);

                world.EntityManager.SetComponent(cameraEditorEntity, new C_Camera()
                {
                    cameraData = CameraData.CreatePerpectiveCamera(45f, 800f / 600f, 0.1f, 100f)
                });

                world.EntityManager.SetComponent(cameraEditorEntity, new C_EditorCamera()
                {
                    speed = 10f, focusPoint = new Vector3(0, 2, 0), focusDistance = 12, pitch = 20, yaw = 115, sensitivity = 20
                });
            }

            void InitLight()
            {
                if (RenderPipelineCore.TryGetContext(out LightsRenderData lightData))
                {
                    lightData.lights.Add(new DirectionalLight());
                }
            }

            void InitUI(EntityWorld world)
            {
                EntityArchetype canvasArch = new EntityArchetype(typeof(C_UICanvas));
                var             entity     = world.EntityManager.CreateEntity(canvasArch);

                world.EntityManager.SetComponent(entity, new C_UICanvas()
                {
                    canvas = new UICanvas()
                });
            }
Exemplo n.º 15
0
 public GizmoPointOrder()
 {
     vao = Ogl.GenVertexArray("Gizmos - Points");
     vbo = Ogl.GenBuffer("Gizmos - Points");
 }
Exemplo n.º 16
0
        private void RenderImDrawData(ImDrawDataPtr draw_data)
        {
            if (draw_data.CmdListsCount == 0)
            {
                return;
            }

            for (int i = 0; i < draw_data.CmdListsCount; i++)
            {
                ImDrawListPtr cmd_list = draw_data.CmdListsRange[i];

                int vertexSize = cmd_list.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>();
                if (vertexSize > vertexBufferSize)
                {
                    int newSize = (int)Math.Max(vertexBufferSize * 1.5f, vertexSize);
                    GL.NamedBufferData(vertexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);
                    vertexBufferSize = newSize;

                    DevConsole.Log(LogType.Verbose, $"Resized dear imgui vertex buffer to new size {vertexBufferSize}");
                }

                int indexSize = cmd_list.IdxBuffer.Size * sizeof(ushort);
                if (indexSize > indexBufferSize)
                {
                    int newSize = (int)Math.Max(indexBufferSize * 1.5f, indexSize);
                    GL.NamedBufferData(indexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw);
                    indexBufferSize = newSize;

                    DevConsole.Log(LogType.Verbose, $"Resized dear imgui index buffer to new size {indexBufferSize}");
                }
            }

            ImGuiIOPtr io  = ImGui.GetIO();
            Matrix4    mvp = Matrix4.CreateOrthographicOffCenter(0.0f, io.DisplaySize.X, io.DisplaySize.Y, 0.0f, -1.0f, 1.0f);

            material.UseMaterial();

            Ogl.UniformMatrix4(material.shader.GetUniformLocation("projection_matrix"), false, ref mvp);
            Ogl.Uniform1(material.shader.GetUniformLocation("in_fontTexture"), 0);

            Ogl.BindVertexArray(vao);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBuffer);

            draw_data.ScaleClipRects(io.DisplayFramebufferScale);

            GL.Enable(EnableCap.Blend);
            GL.Enable(EnableCap.ScissorTest);
            GL.BlendEquation(BlendEquationMode.FuncAdd);
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
            GL.Disable(EnableCap.CullFace);
            GL.Disable(EnableCap.DepthTest);

            // Render command lists
            for (int n = 0; n < draw_data.CmdListsCount; n++)
            {
                ImDrawListPtr cmd_list = draw_data.CmdListsRange[n];

                GL.NamedBufferSubData(vertexBuffer, IntPtr.Zero, cmd_list.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>(), cmd_list.VtxBuffer.Data);

                GL.NamedBufferSubData(indexBuffer, IntPtr.Zero, cmd_list.IdxBuffer.Size * sizeof(ushort), cmd_list.IdxBuffer.Data);

                int vtx_offset = 0;
                int idx_offset = 0;

                for (int cmd_i = 0; cmd_i < cmd_list.CmdBuffer.Size; cmd_i++)
                {
                    ImDrawCmdPtr pcmd = cmd_list.CmdBuffer[cmd_i];
                    if (pcmd.UserCallback != IntPtr.Zero)
                    {
                        throw new NotImplementedException();
                    }
                    else
                    {
                        GL.ActiveTexture(TextureUnit.Texture0);
                        GL.BindTexture(TextureTarget.Texture2D, (int)pcmd.TextureId);

                        var clip = pcmd.ClipRect;
                        GL.Scissor((int)clip.X, windowHeight - (int)clip.W, (int)(clip.Z - clip.X), (int)(clip.W - clip.Y));

                        if ((io.BackendFlags & ImGuiBackendFlags.RendererHasVtxOffset) != 0)
                        {
                            GL.DrawElementsBaseVertex(PrimitiveType.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (IntPtr)(idx_offset * sizeof(ushort)), vtx_offset);
                            //GL.DrawElements(BeginMode.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (int)pcmd.IdxOffset * sizeof(ushort));
                        }
                        else
                        {
                            GL.DrawElements(BeginMode.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (int)pcmd.IdxOffset * sizeof(ushort));
                        }
                    }

                    idx_offset += (int)pcmd.ElemCount;
                }
                vtx_offset += cmd_list.VtxBuffer.Size;
            }

            GL.Disable(EnableCap.Blend);
            GL.Disable(EnableCap.ScissorTest);
        }