Exemplo n.º 1
0
        public void Render(SceneObject sObject, Float3 viewDirection, Float3 lightDirection, bool useProjection = true)
        {
            Mesh mesh = sObject.mesh;
            Color wireFrameColor = Color.LightGreen;
            RenderType renderType = sObject.material.renderType;

            // Vertex uniforms

            // scale matrix
            Float3x3 S = Float3x3.identity * sObject.uniformScale;
            // rotation matrix
            Float3x3 R = Float3x3.getRotationMatrix(sObject.rotation);
            Float3x3 CombinedLinear = S * R;
            // translation
            Float4x4 Tr = Float4x4.identity;
            Tr.setTranslation(sObject.localPosition);
            // projection
            Float4x4 Pr = useProjection ? Float4x4.getProjectionMatrix(10f, 1300f, 1f, 1f) : Float4x4.identity;

            // BACK FACE CULLING
            if (backFaceCulling)
            {
                for (int i = mesh.Triangles.Count - 1; i >= 0; i--)
                {
                    Triangle t = mesh.Triangles[i];

                    Float3 v1 = mesh.Vertices[t[0] - 1].position;
                    Float3 v2 = mesh.Vertices[t[1] - 1].position;
                    Float3 v3 = mesh.Vertices[t[2] - 1].position;
                    Float3 normal = Utils.getTriangleNormalR(v1, v2, v3);

                    // remove faced back triangles
                    if (viewDirection.dot(normal) >= 0)
                        mesh.Triangles.Remove(t);
                }
            }
            // VERTEX SHADER
            for (int i = 0; i < mesh.Vertices.Count; i++)
            {
                Vertex v = mesh.Vertices[i];
                // scale
                var p = v.position.mul(S);
                // rotate
                p = p.mul(R);
                // translate
                p = Tr.transformPoint(p);
                // project
                if(useProjection)
                    p = Pr.transformPoint(p);
                // TODO: Transforming normals while NON UNIFORM TRANSFORMS
                v.normal = v.normal.mul(R);

                // TODO: place to center of screen
                if(useProjection)
                    v.position = new Float3(p.x * Defaults.WIDTH + Defaults.WIDTH / 2f, p.y * Defaults.HEIGHT + Defaults.HEIGHT / 2f, p.z);
                else
                    v.position = new Float3(p.x + Defaults.WIDTH / 2f, p.y + Defaults.HEIGHT / 2f, p.z);
            }

            if((renderType & RenderType.Regular) != 0)
                RenderRegular(mesh, sObject.material, lightDirection);

            if ((renderType & RenderType.Wireframe) != 0)
                RenderWireframe(mesh, wireFrameColor);

            if ((renderType & RenderType.Normals) != 0)
                DrawVertexNormals(mesh, Color.Red);
        }
Exemplo n.º 2
0
        private float getLamberComponent(Float3 normal, Float3 lightDirection)
        {
            normal = normal.normalize();
            lightDirection = lightDirection.normalize();

            float lambertComponent = normal.dot(lightDirection.normalize());
            lambertComponent = lambertComponent < 0 ? 0 : lambertComponent;
            return Utils.Clamp(0, 255, lambertComponent);
        }