public void VectorIndexer() { float x = 10f, y = 11f, z = 12f, h = 13f; var v4 = new Vec4f(); v4 [0] = x; v4 [1] = y; v4 [2] = z; v4 [3] = h; Assert.AreEqual(x, v4 [0]); Assert.AreEqual(y, v4 [1]); Assert.AreEqual(z, v4 [2]); Assert.AreEqual(h, v4 [3]); v4 = new Vec4f(); v4.x = x; v4.y = y; v4.z = z; v4.h = h; Assert.AreEqual(x, v4.x); Assert.AreEqual(y, v4.y); Assert.AreEqual(z, v4.z); Assert.AreEqual(h, v4.h); }
public static Vec4f Mult(Matrix4 m, Vec4f v) { return(new Vec4f { x = m.R0C0 * v.x + m.R0C1 * v.y + m.R0C2 * v.z + m.R0C3 * v.h, y = m.R1C0 * v.x + m.R1C1 * v.y + m.R1C2 * v.z + m.R1C3 * v.h, z = m.R2C0 * v.x + m.R2C1 * v.y + m.R2C2 * v.z + m.R2C3 * v.h, h = m.R3C0 * v.x + m.R3C1 * v.y + m.R3C2 * v.z + m.R3C3 * v.h }); }
public void Vector4_Norm() { var b4 = new Vec4f { x = 1, y = 2, z = 3, h = 4 }; var len = b4.Norm(); Assert.True(Math.Abs(Math.Sqrt(30) - len) <= 0.001); }
public void Project3D() { var v4 = new Vec4f { x = 10, y = 11, z = 12, h = 13 }; var v3 = Geometry.Project3D(v4); Assert.AreEqual(v4.x, v3.x); Assert.AreEqual(v4.y, v3.y); Assert.AreEqual(v4.z, v3.z); }
public void Vector4_Divide() { var v4 = new Vec4f { x = 10, y = 20, z = 30, h = 40 }; var r4 = v4 / 10; Assert.AreEqual(1, r4.x); Assert.AreEqual(2, r4.y); Assert.AreEqual(3, r4.z); Assert.AreEqual(4, r4.h); }
public void Vector4_Normalize() { var b4 = new Vec4f { x = 1, y = 2, z = 3, h = 4 }; var len = b4.Norm(); var n = b4.Normalize(); Assert.True(Math.Abs(n.x - 1f / len) <= 0.001); Assert.True(Math.Abs(n.y - 2f / len) <= 0.001); Assert.True(Math.Abs(n.z - 3f / len) <= 0.001); Assert.True(Math.Abs(n.h - 4f / len) <= 0.001); }
public void Vector4_Sub() { var a4 = new Vec4f { x = 10, y = 20, z = 30, h = 40 }; var b4 = new Vec4f { x = 1, y = 2, z = 3, h = 4 }; var r = a4 - b4; Assert.AreEqual(9, r.x); Assert.AreEqual(18, r.y); Assert.AreEqual(27, r.z); Assert.AreEqual(36, r.h); }
static RenderResult Render(Model model, IShader shader) { var image = new Image(width, height, Format.BGR); var zbuffer = InitZBuffer(image); var screen_coords = new Vec4f [3]; foreach (var face in model.Faces) { for (int i = 0; i < 3; i++) { screen_coords [i] = shader.Vertex(face, i); } Triangle(image, screen_coords, shader, zbuffer); } return(new RenderResult { Image = image, ZBuffer = zbuffer }); }
public static Vec3f Project3D(Vec4f v) { return(new Vec3f { x = v.x, y = v.y, z = v.z }); }
public static Vec2f Project2D(Vec4f v) { return(new Vec2f { x = v.x, y = v.y }); }
static void AmbientListing() { var rnd = new Random(); var screen_coords = new Vec4f [3]; var frame = new Image(width, height, Format.BGR); var shadowbuffer = InitZBuffer(frame); var zbuffer = InitZBuffer(frame); var total = new Image(1024, 1024, Format.BGR); var occl = new Image(1024, 1024, Format.BGR); const int nrenders = 1; for (int iter = 1; iter <= nrenders; iter++) { for (int i = 0; i < shadowbuffer.Length; i++) { shadowbuffer [i] = 0; zbuffer [i] = 0; } var vUp = new Vec3f { x = (float)rnd.NextDouble(), y = (float)rnd.NextDouble(), z = (float)rnd.NextDouble() }; var spLocation = RandPointOnUnitSphere(); spLocation.y = Math.Abs(spLocation.y); frame.Clear(); var mvM = LookAt(spLocation, center, vUp); var pM = Projection(0); var zshader = new ZShader(diabloModel, viewPort, pM, mvM); foreach (var face in diabloModel.Faces) { for (int i = 0; i < 3; i++) { screen_coords [i] = zshader.Vertex(face, i); } Triangle(frame, screen_coords, zshader, shadowbuffer); } //frame.VerticalFlip (); //frame.WriteToFile ("framebuffer.tga"); occl.Clear(); var shader = new OcclusionShader(diabloModel, viewPort, pM, mvM, occl, shadowbuffer, frame.Width); foreach (var face in diabloModel.Faces) { for (int i = 0; i < 3; i++) { screen_coords [i] = shader.Vertex(face, i); } Triangle(frame, screen_coords, shader, zbuffer); } for (int i = 0; i < total.Width; i++) { for (int j = 0; j < total.Height; j++) { float prev = total [i, j] [0]; float curr = occl [i, j] [0]; var val = (byte)((prev * (iter - 1) + curr) / iter + 0.5f); total [i, j] = new Color(val, val, val); } } } total.VerticalFlip(); total.WriteToFile("total-occlusion.tga"); }