Example #1
0
    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);
    }
Example #2
0
    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();
    }