protected override unsafe void Initialize(bgfx.Init *ini) { init(ini); // Enable debug text. set_debug((uint)DebugFlags.Text); // Set view 0 clear state. set_view_clear(0, (ushort)ClearFlags.Color | (ushort)ClearFlags.Depth, 0x303030ff, 1.0f, 0); // Set view 0 default viewport. set_view_rect(0, 0, 0, (ushort)width, (ushort)height); // Create vertex stream declaration. PosColorVertex.init(); var size = Marshal.SizeOf <PosColorVertex>(); // Create static vertex buffer. fixed(void *data = s_cubeVertices) { fixed(VertexLayout *layout = &PosColorVertex.ms_layout) { var r = make_ref(data, (uint)((uint)size * s_cubeVertices.Length)); m_vbh = create_vertex_buffer(r, layout, (ushort)BufferFlags.None); } } m_ibh = new IndexBufferHandle[5]; // Create static index buffer for triangle list rendering. fixed(void *data = s_cubeTriList) { // Static data can be passed with bgfx::makeRef m_ibh[0] = create_index_buffer(make_ref(data, (uint)(sizeof(ushort) * s_cubeTriList.Length)), (ushort)BufferFlags.None); } // Create static index buffer for line list rendering. fixed(void *data = s_cubeTriStrip) { // Static data can be passed with bgfx::makeRef m_ibh[1] = create_index_buffer(make_ref(data, (uint)(sizeof(ushort) * s_cubeTriStrip.Length)), (ushort)BufferFlags.None); } // Create static index buffer for line strip rendering. fixed(void *data = s_cubeLineList) { // Static data can be passed with bgfx::makeRef m_ibh[2] = create_index_buffer(make_ref(data, (uint)(sizeof(ushort) * s_cubeLineList.Length)), (ushort)BufferFlags.None); } // Create static index buffer for line strip rendering. fixed(void *data = s_cubeLineStrip) { // Static data can be passed with bgfx::makeRef m_ibh[3] = create_index_buffer(make_ref(data, (uint)(sizeof(ushort) * s_cubeLineStrip.Length)), (ushort)BufferFlags.None); } // Create static index buffer for point list rendering. fixed(void *data = s_cubePoints) { // Static data can be passed with bgfx::makeRef m_ibh[4] = create_index_buffer(make_ref(data, (uint)(sizeof(ushort) * s_cubePoints.Length)), (ushort)BufferFlags.None); } // Create program from shaders. program = load_program("vs_cubes", "fs_cubes"); }
static void Main(string[] args) { var canvas = new ExampleBase.GraphicsCanvas(); // Create the renderer var renderer = new Fe.Renderer(); // Set the handle from our form so we let Fe create context/devices as appropriate. renderer.SetWindowHandle(canvas.Handle); // Initialise the renderer renderer.Init(); // Create geometry layer command bucker var geometryBucket = renderer.AddCommandBucket(UInt16.MaxValue); // Create the shaders Fe.Shader vertexShader, fragmentShader; switch (renderer.GetRendererType()) { case Fe.RendererType.OpenGL: vertexShader = new Fe.Shader(Fe.ShaderType.Vertex, File.ReadAllText("default.vert")); fragmentShader = new Fe.Shader(Fe.ShaderType.Fragment, File.ReadAllText("default.frag")); break; default: throw new Exception("Unknown backend renderer type"); } Fe.ShaderProgram program = new ShaderProgram(vertexShader, fragmentShader); // Build plane data var plane = new Fe.Extra.Geometry.Plane(30, 30, 30, 30); PosColorVertex[] vertices = new PosColorVertex[plane.Vertices.Length / 3]; Random rand = new Random(); int i = 0; int offset = 0; for (i = 0; i < vertices.Length; i++) { vertices[i].x = plane.Vertices[offset]; vertices[i].y = plane.Vertices[offset + 1]; vertices[i].z = plane.Vertices[offset + 2]; vertices[i].abgr = (uint)(rand.Next(1 << 30)) << 2 | (uint)(rand.Next(1 << 2));; offset += 3; } // Create vertex buffer for our cube var vb = new Fe.VertexBuffer <PosColorVertex>(vertices, true); var ib = new Fe.IndexBuffer(plane.Indices); // Create shared uniforms Fe.Uniform projectionUniform = new Fe.Uniform("projectionMatrix", Fe.UniformType.Matrix4x4f); Fe.UniformBuffer sharedUniforms = new Fe.UniformBuffer(); // Turn off face culling. var rs = new RasteriserState(CullMode.None); Stopwatch frameTimer = Stopwatch.StartNew(); double frameTime = 0; float rotTime = 0.0f; float waveyTime = 0.0f; canvas.Title = "Dynamic vertex buffer update example"; void Resize(int width, int height) { // Set up a projection matrix var projectionMatrix = Nml.Matrix4x4.PerspectiveProjectionRH(Nml.Common.Pi / 4, (float)width / (float)height, 0.1f, 100.0f); projectionMatrix *= Nml.Matrix4x4.Translate(0, 0, -50.0f); sharedUniforms.Set(projectionUniform, projectionMatrix.ToArray()); renderer.Reset(width, height); } // Force an Initial resize, you could handle this with some event on your window if you wanted. Resize(canvas.Width, canvas.Height); void Cleanup() { // Kill off the renderer and clean up all underlying resources. renderer.Dispose(); } void Update() { frameTime = frameTimer.Elapsed.TotalMilliseconds; frameTimer.Restart(); // Increase the animation rotTime += (float)frameTime * 0.0010f; waveyTime += (float)frameTime * 0.01f; var cubeCommand = geometryBucket.AddCommand(1); cubeCommand.SetShaderProgram(program); cubeCommand.SetVertexBuffer(vb); cubeCommand.SetIndexBuffer(ib); cubeCommand.SetSharedUniforms(sharedUniforms); cubeCommand.SetRasteriserState(rs); // Generate new vertice positionsd for (i = 0; i < vertices.Length; i++) { float newPos = (float)Math.Sin(waveyTime + i) * 1.5f; vertices[i].z = newPos; } // Update the buffer vb.SetData(vertices); Nml.Matrix4x4 planeTransform = Nml.Matrix4x4.Identity; // Rotate it to make look pretty Nml.Quaternion rotQuat; Nml.Quaternion.RotateEuler(0, rotTime * 0.37f, rotTime * 0.13f, out rotQuat); Nml.Quaternion.GetMatrix4x4(ref rotQuat, out planeTransform); cubeCommand.SetTransform(planeTransform.ToArray()); // Submit current commands queued to the renderer for rendering. renderer.EndFrame(); } canvas.Resize += () => { Resize(canvas.Width, canvas.Height); }; canvas.Closing += () => { Cleanup(); }; ExampleBase.Application.Run(canvas, () => { Update(); }); }
public DebugLine(PosColorVertex start, PosColorVertex end) { this.start = start; this.end = end; }