Ejemplo n.º 1
0
        /// <summary>
        /// Builds cube sides into this Geometry (these sides are built up of  16 vertices, so texture coordinates and normals are set)
        /// </summary>
        /// <param name="target">Target <see cref="GeometrySurface"/>.</param>
        /// <param name="start">Start point of the cube</param>
        /// <param name="size">Size of the cube</param>
        public static BuiltVerticesRange BuildCubeSides(this GeometrySurface target, Vector3 start, Vector3 size)
        {
            var result = new BuiltVerticesRange(target.Owner)
            {
                StartVertex = target.Owner.CountVertices
            };

            var dest = start + size;

            var texX = 1f;
            var texY = 1f;
            var texZ = 1f;

            if (target.IsTextureTileModeEnabled(out var tileSize))
            {
                texX = size.X / tileSize.X;
                texY = size.Y / tileSize.Y;
                texZ = size.Z / tileSize.X;
            }

            //Front side
            var vertex = new VertexBasic(start, new Vector2(0f, texY), new Vector3(0f, 0f, -1f));
            var a      = target.Owner.AddVertex(vertex);
            var b      = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, start.Y, start.Z), new Vector2(texX, texY)));
            var c      = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, dest.Y, start.Z), new Vector2(texX, 0f)));
            var d      = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, dest.Y, start.Z), new Vector2(0f, 0f)));

            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            //Right side
            a = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, start.Y, start.Z), new Vector3(1f, 0f, 0f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, start.Y, dest.Z), new Vector3(1f, 0f, 0f), new Vector2(texZ, texY)));
            c = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, dest.Y, dest.Z), new Vector3(1f, 0f, 0f), new Vector2(texZ, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, dest.Y, start.Z), new Vector3(1f, 0f, 0f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            //Back side
            a = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, start.Y, dest.Z), new Vector3(0f, 0f, 1f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, start.Y, dest.Z), new Vector3(0f, 0f, 1f), new Vector2(texX, texY)));
            c = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, dest.Y, dest.Z), new Vector3(0f, 0f, 1f), new Vector2(texX, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(new Vector3(dest.X, dest.Y, dest.Z), new Vector3(0f, 0f, 1f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            //Left side
            a = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, start.Y, dest.Z), new Vector3(-1f, 0f, 0f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, start.Y, start.Z), new Vector3(-1f, 0f, 0f), new Vector2(texZ, texY)));
            c = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, dest.Y, start.Z), new Vector3(-1f, 0f, 0f), new Vector2(texZ, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(new Vector3(start.X, dest.Y, dest.Z), new Vector3(-1f, 0f, 0f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            result.VertexCount = target.Owner.CountVertices - result.StartVertex;
            return(result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Builds a cube into this Geometry (this cube is built up of 24 vertices, so texture coordinates and normals are set)
        /// </summary>
        /// <param name="target">Target <see cref="GeometrySurface"/>.</param>
        /// <param name="start">Start point of the cube</param>
        /// <param name="size">Size of the cube</param>
        public static BuiltVerticesRange BuildCube(this GeometrySurface target, Vector3 start, Vector3 size)
        {
            var result = new BuiltVerticesRange(target.Owner);

            result.Merge(target.BuildCubeSides(start, size));
            result.Merge(target.BuildCubeTop(start, size));
            result.Merge(target.BuildCubeBottom(start, size));

            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Builds a cube of 4 vertices and a defined height.
        /// </summary>
        public static BuiltVerticesRange BuildCube(this GeometrySurface target, Vector3 topA, Vector3 topB, Vector3 topC, Vector3 topD, float height)
        {
            var result = new BuiltVerticesRange(target.Owner)
            {
                StartVertex = target.Owner.CountVertices
            };

            var startTriangleIndex = target.CountTriangles;

            // Calculate texture coordinates
            var size = new Vector3(
                (topB - topA).Length(),
                Math.Abs(height),
                (topC - topB).Length());
            var texX = 1f;
            var texY = 1f;
            var texZ = 1f;

            if (target.IsTextureTileModeEnabled(out var tileSize))
            {
                texX = size.X / tileSize.X;
                texY = size.Y / tileSize.Y;
                texZ = size.Z / tileSize.X;
            }

            // Calculate bottom vectors
            var bottomA = new Vector3(topA.X, topA.Y - height, topA.Z);
            var bottomB = new Vector3(topB.X, topB.Y - height, topB.Z);
            var bottomC = new Vector3(topC.X, topC.Y - height, topC.Z);
            var bottomD = new Vector3(topD.X, topD.Y - height, topD.Z);

            // Build Top side
            var vertex = new VertexBasic(topA, new Vector2(texX, 0f), new Vector3(0f, 1f, 0f));
            var a      = target.Owner.AddVertex(vertex);
            var b      = target.Owner.AddVertex(vertex.Copy(topB, new Vector2(texX, texY)));
            var c      = target.Owner.AddVertex(vertex.Copy(topC, new Vector2(0f, texY)));
            var d      = target.Owner.AddVertex(vertex.Copy(topD, new Vector2(0f, 0f)));

            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Build Bottom side
            vertex = new VertexBasic(topA, new Vector2(0f, 0f), new Vector3(0f, -1f, 0f));
            a      = target.Owner.AddVertex(vertex);
            b      = target.Owner.AddVertex(vertex.Copy(topD, new Vector2(texX, 0f)));
            c      = target.Owner.AddVertex(vertex.Copy(topC, new Vector2(texX, texY)));
            d      = target.Owner.AddVertex(vertex.Copy(topB, new Vector2(0f, texY)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Build Front side
            vertex = new VertexBasic(topA, new Vector2(0f, texY), new Vector3(0f, 0f, -1f));
            a      = target.Owner.AddVertex(vertex);
            b      = target.Owner.AddVertex(vertex.Copy(topB, new Vector2(texX, texY)));
            c      = target.Owner.AddVertex(vertex.Copy(bottomB, new Vector2(texX, 0f)));
            d      = target.Owner.AddVertex(vertex.Copy(bottomA, new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Build Right side
            a = target.Owner.AddVertex(vertex.Copy(topB, new Vector3(1f, 0f, 0f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(topC, new Vector3(1f, 0f, 0f), new Vector2(texZ, texY)));
            c = target.Owner.AddVertex(vertex.Copy(bottomC, new Vector3(1f, 0f, 0f), new Vector2(texZ, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(bottomB, new Vector3(1f, 0f, 0f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Build Back side
            a = target.Owner.AddVertex(vertex.Copy(topC, new Vector3(0f, 0f, 1f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(topD, new Vector3(0f, 0f, 1f), new Vector2(texX, texY)));
            c = target.Owner.AddVertex(vertex.Copy(bottomD, new Vector3(0f, 0f, 1f), new Vector2(texX, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(bottomC, new Vector3(0f, 0f, 1f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Build Left side
            a = target.Owner.AddVertex(vertex.Copy(topD, new Vector3(-1f, 0f, 0f), new Vector2(0f, texY)));
            b = target.Owner.AddVertex(vertex.Copy(topA, new Vector3(-1f, 0f, 0f), new Vector2(texZ, texY)));
            c = target.Owner.AddVertex(vertex.Copy(bottomA, new Vector3(-1f, 0f, 0f), new Vector2(texZ, 0f)));
            d = target.Owner.AddVertex(vertex.Copy(bottomD, new Vector3(-1f, 0f, 0f), new Vector2(0f, 0f)));
            target.AddTriangle(a, c, b);
            target.AddTriangle(a, d, c);

            // Calculate normals finally
            target.CalculateNormalsFlat(startTriangleIndex, target.CountTriangles - startTriangleIndex);

            result.VertexCount = target.Owner.CountVertices - result.StartVertex;
            return(result);
        }