Exemplo n.º 1
0
        public void TestDeserialiseMerlinStatic()
        {
            FileStream smallMazeFile = new FileStream(@"C:\Users\Philip\Desktop\HoverGame\HOVER\MAZES\MAZE1.MAZ", FileMode.Open);
            var classRegistry = new MfcClassRegistry();
            classRegistry.RegisterClass("CMerlinStatic", typeof(CMerlinStatic));
            classRegistry.RegisterClass("CMerlinLocation", typeof(CMerlinLocation));

            MfcDeserialiser archive = new MfcDeserialiser(smallMazeFile, classRegistry);
            Maze maze = new Maze();
            maze.Deserialise(archive);
        }
Exemplo n.º 2
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            FileStream smallMazeFile = new FileStream(@"C:\Users\Philip\Desktop\HoverGame\HOVER\MAZES\small.MAZ", FileMode.Open);
            var classRegistry = new MfcClassRegistry();
            classRegistry.AutoRegisterClasses(typeof(Maze).Assembly);

            MfcDeserialiser archive = new MfcDeserialiser(smallMazeFile, classRegistry);
            Maze maze = new Maze();
            maze.Deserialise(archive);

            var form = new HoverForm(maze);
            MainLoop renderFrame = form.RunFrame;
            MessagePump.Run(form, renderFrame);
        }
Exemplo n.º 3
0
        public MazeBrowser(Maze maze)
        {
            this.Maze = maze;

            InitializeComponent();
            Application.AddMessageFilter(this);

            editorView.Maze = maze;

            BindingSource locationsDataSource = new BindingSource(this.Maze, "Locations");
            BindingSource geometryDataSource = new BindingSource(this.Maze, "Geometry");

            listBox1.DataSource = locationsDataSource;
            listBox1.DisplayMember = "Name";

            listBox2.DataSource = geometryDataSource;
            listBox2.DisplayMember = "Name";

            propertyGrid.DataBindings.Add(new Binding("SelectedObject", this, "SelectedObject"));
        }
Exemplo n.º 4
0
        public HoverForm(Maze maze)
            : base("HoverRenderer")
        {
            this.ClientSize = new System.Drawing.Size(640, 480);

            var description = new SwapChainDescription()
            {
                BufferCount = 2,
                Usage = Usage.RenderTargetOutput,
                OutputHandle = this.Handle,
                IsWindowed = true,
                ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
                SampleDescription = new SampleDescription(1, 0),
                Flags = SwapChainFlags.AllowModeSwitch,
                SwapEffect = SwapEffect.Discard
            };

            Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain);

            // create a view of our render target, which is the backbuffer of the swap chain we just created
            using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
            {
                renderTarget = new RenderTargetView(device, resource);
            }

            // Create the depth buffer
            var depthBufferDescription = new Texture2DDescription
            {
                ArraySize = 1,
                BindFlags = BindFlags.DepthStencil,
                CpuAccessFlags = CpuAccessFlags.None,
                Format = Format.D32_Float,
                Height = this.ClientSize.Height,
                Width = this.ClientSize.Width,
                MipLevels = 1,
                SampleDescription = new SampleDescription(1, 0),
                Usage = ResourceUsage.Default
            };
            using (var depthBuffer = new Texture2D(device, depthBufferDescription))
            {
                depthStencilView = new DepthStencilView(device, depthBuffer);
                depthStencilState = DepthStencilState.FromDescription(device, new DepthStencilStateDescription {
                    IsDepthEnabled = true,
                    IsStencilEnabled = false,
                    DepthWriteMask = DepthWriteMask.All,
                    DepthComparison = Comparison.LessEqual
                });
            }

            // Setup wireframe mode
            rasteriserState = RasterizerState.FromDescription(device, new RasterizerStateDescription
            {
                CullMode = SlimDX.Direct3D11.CullMode.None,
                FillMode = SlimDX.Direct3D11.FillMode.Wireframe
            });

            // setting a viewport is required if you want to actually see anything
            context = device.ImmediateContext;
            var viewport = new Viewport(0.0f, 0.0f, this.ClientSize.Width, this.ClientSize.Height);
            context.OutputMerger.SetTargets(depthStencilView, renderTarget);
            context.OutputMerger.DepthStencilState = depthStencilState;
            context.Rasterizer.State = rasteriserState;
            context.Rasterizer.SetViewports(viewport);

            // load and compile the vertex shader
            using (var bytecode = ShaderBytecode.CompileFromFile("shader.fx", "VShader", "vs_4_0", ShaderFlags.Debug, EffectFlags.None))
            {
                inputSignature = ShaderSignature.GetInputSignature(bytecode);
                vertexShader = new VertexShader(device, bytecode);
            }

            // load and compile the pixel shader
            using (var bytecode = ShaderBytecode.CompileFromFile("shader.fx", "PShader", "ps_4_0", ShaderFlags.Debug, EffectFlags.None))
                pixelShader = new PixelShader(device, bytecode);

            // create test vertex data, making sure to rewind the stream afterward
            vertices = CreateTriangleListFromMaze(maze);
            camera.Position = FindHumanStartPosition(maze);

            // create the vertex layout and buffer
            var elements = new[] {
                new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
                new InputElement("COLOR", 0, Format.R32G32B32_Float, 0)
            };
            layout = new InputLayout(device, inputSignature, elements);
            vertexBuffer = new Buffer(device, vertices, (int)vertices.Length, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

            // configure the Input Assembler portion of the pipeline with the vertex data
            context.InputAssembler.InputLayout = layout;
            context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 24, 0));

            // set the shaders
            context.VertexShader.Set(vertexShader);
            context.PixelShader.Set(pixelShader);

            // crate the constant buffer
            constantBuffer = new Buffer(device, new BufferDescription
            {
                Usage = ResourceUsage.Default,
                SizeInBytes = Marshal.SizeOf(typeof(ConstantBuffer)),
                BindFlags = BindFlags.ConstantBuffer
            });

            // prevent DXGI handling of alt+enter, which doesn't work properly with Winforms
            using (var factory = swapChain.GetParent<Factory>())
                factory.SetWindowAssociation(this.Handle, WindowAssociationFlags.IgnoreAltEnter);

            // handle alt+enter ourselves
            this.KeyDown += (o, e) =>
            {
                if (e.Alt && e.KeyCode == Keys.Enter)
                    swapChain.IsFullScreen = !swapChain.IsFullScreen;
            };

            // handle form size changes
            this.UserResized += (o, e) =>
            {
                renderTarget.Dispose();

                swapChain.ResizeBuffers(2, 0, 0, Format.R8G8B8A8_UNorm, SwapChainFlags.AllowModeSwitch);
                using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
                    renderTarget = new RenderTargetView(device, resource);

                context.OutputMerger.SetTargets(renderTarget);
            };

            this.KeyDown += new KeyEventHandler(HoverForm_KeyDown);
        }
Exemplo n.º 5
0
 private Vector3 FindHumanStartPosition(Maze maze)
 {
     //return new Vector3(0, 0, 0);
     var humanStart = maze.Locations.Single(l => l.Name.StartsWith("HUMAN_00"));
     return new Vector3(humanStart.X, humanStart.Y, humanStart.Z);
 }
Exemplo n.º 6
0
        private DataStream CreateTriangleListFromMaze(Maze maze)
        {
            var geometry = maze.Geometry;
            triangleCount = geometry.Count * 2;
            //triangleCount += 1;

            // Each CMerlinStatic becomes two triangles
            DataStream vertices = new DataStream(triangleCount * 6 * Vector3.SizeInBytes, true, true);

            foreach (var merlinStatic in geometry)
            {
                vertices.Write(new Vector3(merlinStatic.X1, merlinStatic.Y1, merlinStatic.BottomZ));
                vertices.Write(new Vector3(1, 0, 0));
                vertices.Write(new Vector3(merlinStatic.X2, merlinStatic.Y2, merlinStatic.BottomZ));
                vertices.Write(new Vector3(0, 1, 0));
                vertices.Write(new Vector3(merlinStatic.X1, merlinStatic.Y1, merlinStatic.TopZ));
                vertices.Write(new Vector3(0, 0, 1));

                vertices.Write(new Vector3(merlinStatic.X1, merlinStatic.Y1, merlinStatic.TopZ));
                vertices.Write(new Vector3(1, 0, 0));
                vertices.Write(new Vector3(merlinStatic.X2, merlinStatic.Y2, merlinStatic.BottomZ));
                vertices.Write(new Vector3(0, 1, 0));
                vertices.Write(new Vector3(merlinStatic.X2, merlinStatic.Y2, merlinStatic.TopZ));
                vertices.Write(new Vector3(0, 0, 1));
            }

            // Add deug visualisation
            //vertices.Write(new Vector3(.0f, .1f, 5f));
            //vertices.Write(new Vector3( .1f, -.1f,  5f));
            //vertices.Write(new Vector3(-.1f, -.1f,  5f));

            // Reset stream so SlimDX can use it
            vertices.Position = 0;

            return vertices;
        }