void FillTriangle(Vertex v1, Vertex v2, Vertex v3, Bitmap texture) { var screenSpace = Matrix4Utils.ScreenSpace(Width / 2, Height / 2); Matrix4 iden = Matrix4.Identity; Vertex minYVert = v1.Transform(screenSpace, iden).PerspectiveDivide(); Vertex midYVert = v2.Transform(screenSpace, iden).PerspectiveDivide(); Vertex maxYVert = v3.Transform(screenSpace, iden).PerspectiveDivide(); if (minYVert.TriangleAreaTimesTwo(maxYVert, midYVert) >= 0) { return; } if (maxYVert.Y < midYVert.Y) { Swap(ref maxYVert, ref midYVert); } if (midYVert.Y < minYVert.Y) { Swap(ref midYVert, ref minYVert); } if (maxYVert.Y < midYVert.Y) { Swap(ref maxYVert, ref midYVert); } float a = minYVert.TriangleAreaTimesTwo(maxYVert, midYVert); ScanTriangle(minYVert, midYVert, maxYVert, a >= 0, texture); }
static void Main(string[] args) { UnusedParameters(args); Display display = new Display(); RenderContext target = display.FrameBuffer; Bitmap texture = new Bitmap("./res/bricks.jpg"); Bitmap texture2 = new Bitmap("./res/bricks2.jpg"); Mesh monkeyMesh = Mesh.FromFile("./res/smoothMonkey0.obj"); Mesh terrainMesh = Mesh.FromFile("./res/terrain2.obj"); Transform monkeyTransform = new Transform(new Vector4(0, 0, 3, 1)); Transform terrainTransform = new Transform(new Vector4(0, -1, 0, 1)); Camera camera = new Camera( Matrix4Utils.Perspective( MathHelper.DegreesToRadians(70), (float)target.Width / target.Height, 0.1f, 1000.0f ) ); long previousTime = DateTime.UtcNow.Ticks; display.UpdateFrame += delegate(object s, FrameEventArgs e) { UnusedParameters(s, e); long currentTime = DateTime.UtcNow.Ticks; float delta = (float)((currentTime - previousTime) / 10000000.0); previousTime = currentTime; camera.Update(display.Input, delta); Matrix4 vp = camera.ViewProjection; monkeyTransform = monkeyTransform.Rotate( Quaternion.FromAxisAngle(new Vector3(0, 1, 0), delta) ); target.Clear(0x00); target.ClearDepthBuffer(); monkeyMesh.Draw(target, vp, monkeyTransform.Matrix, texture2); terrainMesh.Draw(target, vp, terrainTransform.Matrix, texture); display.SwapBuffers(); }; display.Run(); }