Skip to content

ansel86castro/Igneel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Igneel Engine

Game engine for .NET

In order to compile the code you must download and install the DirectXSDK at https://www.microsoft.com/en-us/download/details.aspx?id=6812

Demostration: https://youtu.be/3mU4TyAGuDU

Additional SDKs Nvidia PhysX runtime: http://www.nvidia.com/object/physx-9.16.0318-driver.html

#Using the Graphics API

	public partial class Form1 : Form
	{
		[StructLayout(LayoutKind.Sequential)]        
		public struct TriangleVertex
		{
			[VertexElement(IASemantic.Position)]
			public Vector3 Position;

			[VertexElement(IASemantic.Color)]
			public Color4 Color;

			public TriangleVertex(Vector3 Position, Color4 color)
			{
				this.Position = Position;
				this.Color = color;
			}
		}

		public interface ProgramMapping
		{
			Matrix WorldViewProj { get; set; }
		}


		GraphicDevice device;

		GraphicBuffer vertexBuffer;

		ShaderProgram shaderProgram;

		//The shader program mapping
		ProgramMapping input;

		//Transforms
		Matrix world;
		Matrix view;
		Matrix projection;

		//pipeline states
		private RasterizerState cullingState;
		private BlendState blendState;
		private DepthStencilState depthStenciState;

		public Form1()
		{
			SetStyle(ControlStyles.Opaque, true);

			InitializeComponent();                                

			CreateDevice();

			CreateTriangle();

			Application.Idle += (sender, args) =>
			{
				NativeMessage message;
				while (!Native.PeekMessage(out message, IntPtr.Zero, 0, 0, 0))
				{
					RenderFrame();
				}
			};
		}      

		protected override void OnResize(EventArgs e)
		{
			base.OnResize(e);

			device.ResizeBackBuffer(Width, Height);
			device.ViewPort = new ViewPort(0, 0, Width, Height);
			projection = Matrix.PerspectiveFovLh((float)Width / (float)Height, Igneel.Numerics.PIover6, 1, 1000);
		}

	   
		private void CreateDevice()
		{				
			//Setup the shader model and directory
			ShaderRepository.SetupD3D10_SM40("Shaders");

			//Use Direct3D10 by creating the corresponding GraphicDeviceFactory
			var devFactory = new IgneelD3D10.GraphicManager10();

			//Use the GraphicDeviceFactory to create the CreateDevice passing the WindowContext
			//with presentation settings

			device = devFactory.CreateDevice(new GraphicDeviceDesc(new WindowContext(Handle)
				{
					BackBufferWidth = Width,
					BackBufferHeight = Height,
					BackBufferFormat = Format.R8G8B8A8_UNORM_SRGB,
					DepthStencilFormat = Format.D24_UNORM_S8_UINT,
					FullScreen = false,
					Sampling = new Multisampling(1, 0),
					Presentation = PresentionInterval.Default
				}
			));


			//Creates a shader program holding the code for the vertex and pixel shader
			//specify the IA input layout by using the vertex struct
			shaderProgram = device.CreateProgram<TriangleVertex>("VertexShaderVS", "PixelShaderPS");

			//Get the shader program input mapping. Use this mapping for sending app values to the shaders
			input = shaderProgram.Map<ProgramMapping>();

			//Create and set default pipeline states
			//then your are ready to render				
			blendState = device.CreateBlendState(new BlendDesc(blendEnable: true, srcBlend: Blend.SourceAlpha, destBlend: Blend.InverseSourceAlpha));
			depthStenciState = device.CreateDepthStencilState(new DepthStencilStateDesc(depthFunc: Comparison.Less));
			cullingState = device.CreateRasterizerState(new RasterizerDesc(cull: CullMode.None));

			device.Blend = blendState;
			device.Rasterizer = cullingState;
			device.DepthTest = depthStenciState;

		}


		private void CreateTriangle()
		{
			//Creates a triangle with position and color data
			var data = new TriangleVertex[]{
				new TriangleVertex(new Vector3(0, 1, 0), Color4.Blue),
				new TriangleVertex(new Vector3(1, -1, 0), Color4.Green),                
				new TriangleVertex(new Vector3(-1, -1, 0), Color4.Red)
			};


			//Create the vertex buffer specifing the data array
			vertexBuffer = device.CreateVertexBuffer(data: data);

			//Create the scene transforms
			world = Matrix.Identity;
			view = Matrix.LookAt(new Vector3(0, 0, -1), new Vector3(0, 0, 1), Vector3.UnitY);
			projection = Matrix.PerspectiveFovLh((float)Width / (float)Height, Igneel.Numerics.PIover6, 1, 1000);            
		}        

	   
		//This method is where rendering takes places. Its executed when the app is no processing any message
		private void RenderFrame()
		{
			//Set render target and the depth stencil buffers
			//In order to render to the screen just use the device BackBuffer and BackDepthBuffer
			//you can specify order render targets to render to textures for example
			device.SetRenderTarget(device.BackBuffer, device.BackDepthBuffer);

			//Specify the render viewport

			device.ViewPort = new ViewPort(0, 0, Width, Height);

			//Clear the render target and depth stencil buffers
			device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, new Color4(0, 0, 0, 0), 1, 0);
			
			//Set the primitive type and vertex buffer
			device.PrimitiveTopology = IAPrimitive.TriangleList;
			device.SetVertexBuffer(0, vertexBuffer, 0);

			//Set the shader program
			device.Program = shaderProgram;
			
			//Send the transforms to the shader using the input mapping

			input.WorldViewProj = world * view * projection;

			//Draw the geometry
			device.Draw(3, 0);

			//finally present the render target to the screen.
			//This will call the default SwapChain.Present() 

			device.Present();
		}

	  
	}