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); }
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); }
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")); }
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); }
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); }
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; }