Example #1
0
        public void RenderNode(Node3D node, Effect3D fx)
        {
            if (node is Entity3D)
            {
                var ent = node as Entity3D;
                FXG.Local = ent.World;
                fx.Bind();


                foreach (var mesh in ent.Meshes)
                {
                    mesh.Material.Bind();
                    mesh.Viz.SetMesh(mesh);
                    mesh.Viz.Bind();
                    mesh.Viz.Visualize();
                    mesh.Viz.Release();
                    mesh.Material.Release();
                }
                fx.Release();
            }
            foreach (var s_node in node.Sub)
            {
                RenderNode(s_node, fx);
            }
        }
Example #2
0
        public static void EndDraw(Effect3D fx, Binder bind)
        {
            if (!begun)
            {
                return;
            }
            begun = false;
            GL.Enable(EnableCap.DepthTest);

            GL.Disable(EnableCap.CullFace);

            //  GL.Viewport(0, 0, Vivid.App.AppInfo.W, Vivid.App.AppInfo.H);

            fx.Bind();

            foreach (var draw_list in Draws)
            {
                var vert_arr = GL.GenVertexArray();
                var vert_buf = GL.GenBuffer();
                // var ind_buf = GL.GenBuffer();

                int draw_c = draw_list.Data.Count * 4;

                int draw_i = 0;

                float[] vert_data = new float[draw_c * 9];
                uint[]  ind_data  = new uint[draw_c];

                int vert_i = 0;
                int int_i  = 0;

                bind?.Invoke();
                //draw_list.Data[0].Img.Bind(0);

                foreach (var data in draw_list.Data)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        ind_data[int_i] = (uint)int_i++;
                    }

                    vert_data[vert_i++] = data.X;
                    vert_data[vert_i++] = data.Y;
                    vert_data[vert_i++] = data.Z;

                    vert_data[vert_i++] = 0;
                    vert_data[vert_i++] = 0;

                    vert_data[vert_i++] = data.Col.X;
                    vert_data[vert_i++] = data.Col.Y;
                    vert_data[vert_i++] = data.Col.Z;
                    vert_data[vert_i++] = data.Col.W;

                    vert_data[vert_i++] = data.X + data.W;
                    vert_data[vert_i++] = data.Y;
                    vert_data[vert_i++] = data.Z;

                    vert_data[vert_i++] = 1;
                    vert_data[vert_i++] = 0;

                    vert_data[vert_i++] = data.Col.X;
                    vert_data[vert_i++] = data.Col.Y;
                    vert_data[vert_i++] = data.Col.Z;
                    vert_data[vert_i++] = data.Col.W;

                    vert_data[vert_i++] = data.X + data.W;
                    vert_data[vert_i++] = data.Y + data.H;
                    vert_data[vert_i++] = data.Z;

                    vert_data[vert_i++] = 1;
                    vert_data[vert_i++] = 1;

                    vert_data[vert_i++] = data.Col.X;
                    vert_data[vert_i++] = data.Col.Y;
                    vert_data[vert_i++] = data.Col.Z;
                    vert_data[vert_i++] = data.Col.W;

                    vert_data[vert_i++] = data.X;
                    vert_data[vert_i++] = data.Y + data.H;
                    vert_data[vert_i++] = data.Z;

                    vert_data[vert_i++] = 0;
                    vert_data[vert_i++] = 1;

                    vert_data[vert_i++] = data.Col.X;
                    vert_data[vert_i++] = data.Col.Y;
                    vert_data[vert_i++] = data.Col.Z;
                    vert_data[vert_i++] = data.Col.W;
                }

                //   GL.BindBuffer(BufferTarget.ElementArrayBuffer, ind_buf);
                //  GL.BufferData(BufferTarget.ElementArrayBuffer, 4 * 4, ind_data, BufferUsageHint.StaticDraw);

                GL.BindVertexArray(vert_arr);

                GL.BindBuffer(BufferTarget.ArrayBuffer, vert_buf);

                GL.BufferData(BufferTarget.ArrayBuffer, vert_data.Length * 4, vert_data, BufferUsageHint.StaticDraw);

                GL.EnableVertexAttribArray(0);
                GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 9 * 4, 0);

                GL.EnableVertexAttribArray(1);
                GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, 9 * 4, 3 * 4);

                GL.EnableVertexAttribArray(2);
                GL.VertexAttribPointer(2, 4, VertexAttribPointerType.Float, false, 9 * 4, 5 * 4);

                GL.DrawElements <uint>(PrimitiveType.Quads, draw_c, DrawElementsType.UnsignedInt, ind_data);

                GL.DisableVertexAttribArray(0);
                GL.DisableVertexAttribArray(1);
                GL.DisableVertexAttribArray(2);

                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
                //  GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

                GL.DeleteBuffer(vert_buf);
                GL.DeleteVertexArray(vert_arr);
                // GL.DeleteBuffer(ind_buf);

                // draw_list.Data[0].Img.Release(0);
            }


            fx.Release();
        }
Example #3
0
        static void Main()
        {
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();

            var texturePathA = Path.Combine(Path.GetDirectoryName(AppContext.BaseDirectory), "a.png");
            var texturePathB = Path.Combine(Path.GetDirectoryName(AppContext.BaseDirectory), "b.png");
            var textureDataA = File.ReadAllBytes(texturePathA);
            var textureDataB = File.ReadAllBytes(texturePathB);
            var vertexShader = File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(AppContext.BaseDirectory), "VertexShader.cso"));
            var pixelShader  = File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(AppContext.BaseDirectory), "PixelShader.cso"));

            using var form  = new Form();
            using var scene = new Scene3D();

#if DEBUG
            scene.EnableDebug();
#endif
            scene.Initialize(form.Handle, 0.0f, 0.0f, form.Size.Width, form.Size.Height);
            float w       = 1600;
            float h       = 450;
            var   indices = new ushort[6] {
                0, 1, 2, 0, 2, 3
            };
            var vertices = new Vertex[4]
            {
                new Vertex()
                {
                    Position = new Vector3F32(),
                    Normal   = new Vector3F32 {
                        Z = 1.0f
                    },
                    TexCoord = new Vector2F32 {
                        X = 0.0f, Y = 1.0f
                    }
                },
                new Vertex()
                {
                    Position = new Vector3F32 {
                        X = w
                    },
                    Normal = new Vector3F32 {
                        Z = 1.0f
                    },
                    TexCoord = new Vector2F32 {
                        X = 2.0f, Y = 1.0f
                    }
                },
                new Vertex()
                {
                    Position = new Vector3F32 {
                        X = w, Y = h
                    },
                    Normal = new Vector3F32 {
                        Z = 1.0f
                    },
                    TexCoord = new Vector2F32 {
                        X = 2.0f, Y = 0.0f
                    }
                },
                new Vertex()
                {
                    Position = new Vector3F32 {
                        Y = h
                    },
                    Normal = new Vector3F32 {
                        Z = 1.0f
                    },
                    TexCoord = new Vector2F32()
                }
            };
            var textureMatrixX = stackalloc float[9];
            var textureMatrixY = stackalloc float[12];
            var color          = stackalloc float[4] {
                0.0f,
                0.0f,
                0.0f,
                0.0f,
            };

            textureMatrixX[0] = textureMatrixX[4] = textureMatrixX[8] = 1.0f;
            textureMatrixY[0] = textureMatrixY[5] = textureMatrixY[10] = 1.0f;


            var inputs = new List <InputElement>()
            {
                new InputElement()
                {
                    SemanticName         = "POS",
                    SemanticIndex        = 0,
                    Format               = Format.R32G32B32Float,
                    InputSolt            = 0,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerVertexData,
                    InstanceDataStepRate = 0
                },
                new InputElement()
                {
                    SemanticName         = "NORMAL",
                    SemanticIndex        = 0,
                    Format               = Format.R32G32B32Float,
                    InputSolt            = 0,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerVertexData,
                    InstanceDataStepRate = 0
                },
                new InputElement()
                {
                    SemanticName         = "TEXCOORD",
                    SemanticIndex        = 0,
                    Format               = Format.R32G32Float,
                    InputSolt            = 0,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerVertexData,
                    InstanceDataStepRate = 0
                },
                new InputElement()
                {
                    SemanticName         = "TEXMATRIX",
                    SemanticIndex        = 0,
                    Format               = Format.R32G32B32Float,
                    InputSolt            = 1,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerInstanceData,
                    InstanceDataStepRate = 0
                },
                new InputElement()
                {
                    SemanticName         = "TEXMATRIX",
                    SemanticIndex        = 1,
                    Format               = Format.R32G32B32Float,
                    InputSolt            = 1,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerInstanceData,
                    InstanceDataStepRate = 0
                },
                new InputElement()
                {
                    SemanticName         = "TEXMATRIX",
                    SemanticIndex        = 2,
                    Format               = Format.R32G32B32Float,
                    InputSolt            = 1,
                    AlignedByteOffset    = InputElement.AppendAlignedElement,
                    InputSlotClass       = InputClassification.PerInstanceData,
                    InstanceDataStepRate = 0
                }
            };

            using var index        = new MemoryIndex <ushort>(scene, indices);
            using var attribute1   = new MemoryAttribute <Vertex>(scene, vertices, (uint) sizeof(Vertex));
            using var attribute2   = new DX.Sharp.Attribute(scene, textureMatrixX, 4, 9, 36);
            using var constant     = new Constant(scene, textureMatrixY, 4, 12);
            using var constant2    = new Constant(scene, color, 4, 4);
            using var textureHeap1 = new DescriptorHeap(scene.Device, 2);
            using var textureHeap2 = new DescriptorHeap(scene.Device, 2);
            using var samplerHeap  = new DescriptorHeap(scene.Device, DescriptorHeapType.Sampler, DescriptorHeapFlags.ShaderVisible, 1);
            using var effect       = new Effect3D(inputs, new Constant[] { constant2 }, 1, 2, 1);
            using var loader       = new TextureLoader(scene.Device, scene.CommandQueue);

            effect.Initialize(scene, vertexShader, pixelShader, ref BlendDescription.Opaque, ref DepthStencilDescription.Default, ref RasteriazerDescription.Default, Format.B8G8R8A8UNorm, Format.D32Float);

            var textures = new List <Resource>()
            {
                new Resource(),
                new Resource()
            };


            scene.Device.CreateSampler(ref SamplerDescrption.LinearWrap, samplerHeap.GetCpuHandle(0));

            loader.Begin();
            loader.CreateTexture(textureDataA, textures[0]);
            loader.CreateShaderResourceView(textures[0], textureHeap1.GetCpuHandle(0));
            loader.CreateShaderResourceView(textures[0], textureHeap2.GetCpuHandle(1));
            loader.CreateTexture(textureDataB, textures[1]);
            loader.CreateShaderResourceView(textures[1], textureHeap1.GetCpuHandle(1));
            loader.CreateShaderResourceView(textures[1], textureHeap2.GetCpuHandle(0));
            loader.End();


            using var obj1 = new Object3D(new List <DX.Sharp.Attribute> { attribute1, attribute2 }, index, new List <Constant> { constant }, effect, textureHeap1, samplerHeap);
            using var obj2 = new Object3D(new List <DX.Sharp.Attribute> { attribute1, attribute2 }, index, new List <Constant> { constant }, effect, textureHeap2, samplerHeap);

            obj1.Initialize(scene);
            obj2.Initialize(scene);

            scene.SetRenderList(new List <Object3D> {
                obj1, obj2
            });
            using var transform = new XMMatrix();
            var minimized = false;

            scene.SetInactiveTargetUpdateTimeout(true, 1.0 / 30);

            form.Resize += (sender, e) =>
            {
                if (form.WindowState == FormWindowState.Minimized)
                {
                    scene.OnSuspending();
                    minimized = true;
                }
                else if (minimized)
                {
                    scene.OnResuming();
                    minimized = false;
                }

                scene.OnWindowSizeChanged(0.0f, 0.0f, form.Size.Width, form.Size.Height);
                scene.Tick();
            };

            form.Activated += (sender, e) =>
            {
                scene.OnActivated();
            };

            form.Deactivate += (sender, e) =>
            {
                scene.OnDeactivated();
            };

            uint  count      = 0;
            float scale      = 1;
            float step       = 0.01f;
            float angle      = 0;
            float angleStep  = 1;
            var   random     = new Random();
            var   viewMatrix = new XMMatrix();

            scene.OnUpdate += (scene, second, frame) =>
            {
                if (frame > 1)
                {
                    scale += step;
                    angle += angleStep;
                    count++;
                }

                if (angle > 360)
                {
                    angle -= 360;
                }

                if (scale > 1.0f || scale < 0.1)
                {
                    step = -step;
                }

                textureMatrixX[0] = scale;
                textureMatrixY[5] = scale;

                if (count == 10)
                {
                    count    = 0;
                    color[0] = (float)random.NextDouble();
                    color[1] = (float)random.NextDouble();
                    color[2] = (float)random.NextDouble();
                    color[3] = (float)random.NextDouble();
                }

                attribute2.Update(textureMatrixX);
                constant.Update(textureMatrixY);
                constant2.Update(color);

                Transform(transform, scene.Viewport, angle, scale, w, h);
                obj1.UpdateModelView(transform, viewMatrix);

                Transform(transform, scene.Viewport, angle * 2, scale, w, h);
                obj2.UpdateModelView(transform, viewMatrix);
            };

            RenderLoop.Run(form, scene.Tick);
        }