Exemplo n.º 1
0
        /// <summary>
        /// Renders the mesh usign World matrix from Node, the View matrix from camera and the Material
        /// </summary>
        /// <param name="node"></param>
        /// <param name="camera"></param>
        /// <param name="material"></param>
        public void Draw(Node node, Camera camera, Material material, RenderableMeshPart meshPart, List <Light> lights = null)
        {
            UpdateInternal();

            //Matrix matrix=Matrix.Identity;

            //Internal.Draw(ref matrix, ref matrix, ref matrix, material);

            Internal.Draw(ref node.WorldMatrix, ref camera.View, ref camera.Projection, material, camera, ref meshPart, lights);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Creates a RenderableMeshMultiMaterial for a 1 unit Cube with 6 faces
        /// Each face has is own TextureCoords, so you could assign one texture to each face
        /// Face 0 is Rear Face
        /// Face 1 is Front
        /// Face 2 is Top
        /// Face 3 is Bottom
        /// Face 4 is Left
        /// Face 5 is Right
        /// </summary>
        /// <param name="device"></param>
        public static RenderableMeshMultiMaterial CreateCube(VisualEngine engine)
        {
            MeshBasic mesh = new MeshBasic(engine, 24, 36);

            Vector3[] vb = mesh.Position;

            Vector3[] normal = mesh.Normal = new Vector3[mesh.NumVertices];

            Vector2[,] texCoord = mesh.TexCoord = new Vector2[1, mesh.NumVertices];

            mesh.Tangent = new Vector3[mesh.NumVertices];

            mesh.VertexColor = new Vector4[mesh.NumVertices];

            uint[] ib = mesh.Indices;

            uint i = 0;

            // Rear 0
            vb[i] = new Vector3(0.5f, 0.5f, -0.5f); normal[i] = new Vector3(0, 0, -1); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(-0.5f, 0.5f, -0.5f); normal[i] = new Vector3(0, 0, -1); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, -0.5f); normal[i] = new Vector3(0, 0, -1); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(0.5f, -0.5f, -0.5f); normal[i] = new Vector3(0, 0, -1); texCoord[0, i] = new Vector2(0, 1); i++;

            // Front 4
            vb[i] = new Vector3(-0.5f, 0.5f, 0.5f); normal[i] = new Vector3(0, 0, 1); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(0.5f, 0.5f, 0.5f); normal[i] = new Vector3(0, 0, 1); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(0.5f, -0.5f, 0.5f); normal[i] = new Vector3(0, 0, 1); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, 0.5f); normal[i] = new Vector3(0, 0, 1); texCoord[0, i] = new Vector2(0, 1); i++;

            // Top 8
            vb[i] = new Vector3(-0.5f, 0.5f, -0.5f); normal[i] = new Vector3(0, 1, 0); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(0.5f, 0.5f, -0.5f); normal[i] = new Vector3(0, 1, 0); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(0.5f, 0.5f, 0.5f); normal[i] = new Vector3(0, 1, 0); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(-0.5f, 0.5f, 0.5f); normal[i] = new Vector3(0, 1, 0); texCoord[0, i] = new Vector2(0, 1); i++;

            // Bottom 12
            vb[i] = new Vector3(0.5f, -0.5f, -0.5f); normal[i] = new Vector3(0, -1, 0); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, -0.5f); normal[i] = new Vector3(0, -1, 0); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, 0.5f); normal[i] = new Vector3(0, -1, 0); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(0.5f, -0.5f, 0.5f); normal[i] = new Vector3(0, -1, 0); texCoord[0, i] = new Vector2(0, 1); i++;

            // Left 16
            vb[i] = new Vector3(-0.5f, 0.5f, -0.5f); normal[i] = new Vector3(-1, 0, 0); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(-0.5f, 0.5f, 0.5f); normal[i] = new Vector3(-1, 0, 0); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, 0.5f); normal[i] = new Vector3(-1, 0, 0); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(-0.5f, -0.5f, -0.5f); normal[i] = new Vector3(-1, 0, 0); texCoord[0, i] = new Vector2(0, 1); i++;

            // Right 20
            vb[i] = new Vector3(0.5f, 0.5f, 0.5f); normal[i] = new Vector3(1, 0, 0); texCoord[0, i] = new Vector2(0, 0); i++;
            vb[i] = new Vector3(0.5f, 0.5f, -0.5f); normal[i] = new Vector3(1, 0, 0); texCoord[0, i] = new Vector2(1, 0); i++;
            vb[i] = new Vector3(0.5f, -0.5f, -0.5f); normal[i] = new Vector3(1, 0, 0); texCoord[0, i] = new Vector2(1, 1); i++;
            vb[i] = new Vector3(0.5f, -0.5f, 0.5f); normal[i] = new Vector3(1, 0, 0); texCoord[0, i] = new Vector2(0, 1); i++;

            for (int k = 0; k < i; k++)
            {
                // Tangent vectors are always the same for a cube

                mesh.Tangent[k] = new Vector3(1, 0, 0);

                mesh.VertexColor[k] = new Vector4(1, 1, 1, 1);
            }

            // OGL COUNTER-ClockWISE order

            i = 0;

            for (uint face = 0; face < 6; face++)
            {
                uint vertex = face * 4;

                ib[i++] = vertex + 2;
                ib[i++] = vertex + 1;
                ib[i++] = vertex + 0;
                ib[i++] = vertex + 2;
                ib[i++] = vertex + 0;
                ib[i++] = vertex + 3;
            }

            // Create the RenderableMeshPart, six parts, one part for each face
            RenderableMeshMultiMaterial renderable = new RenderableMeshMultiMaterial(mesh);

            renderable.Mesh.MeshParts = new List <RenderableMeshPart>(6);

            for (i = 0; i < 6; i++)
            {
                RenderableMeshPart meshPart = new RenderableMeshPart(6, i * 6, 0);

                renderable.Mesh.MeshParts.Add(meshPart);
            }

            return(renderable);
        }