Пример #1
0
        public static void GenerateCuboid(Cuboid shapeDesc, Transform transform, Vector2 texScale, bool insideOut, out IList <CSGVertex> vertices, out IList <uint> indices)
        {
            CSGPlane[] planes = new CSGPlane[6];

            #region Construct Non-Transformed Planes
            Plane       facePlane;
            CSGVertex[] faceVertices;
            Vector3     faceNormal;

            // Top face
            faceNormal   = Vector3.UP;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopLeft));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopLeft),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopRight),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopRight),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, shapeDesc.Depth / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopLeft),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Depth / texScale.Y)
                    ),
            };
            planes[0] = new CSGPlane(facePlane, faceVertices);

            // Bottom face
            faceNormal   = Vector3.DOWN;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomLeft));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomRight),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomRight),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Depth / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, shapeDesc.Depth / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, 0f)
                    ),
            };
            planes[1] = new CSGPlane(facePlane, faceVertices);

            // Front face
            faceNormal   = Vector3.BACKWARD;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomLeft));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopLeft),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopRight),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomRight),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, shapeDesc.Height / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomLeft),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Height / texScale.Y)
                    ),
            };
            planes[2] = new CSGPlane(facePlane, faceVertices);

            // Back face
            faceNormal   = Vector3.FORWARD;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomLeft));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopRight),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Width / texScale.X, shapeDesc.Height / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomRight),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Height / texScale.Y)
                    ),
            };
            planes[3] = new CSGPlane(facePlane, faceVertices);

            // Left face
            faceNormal   = Vector3.LEFT;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomLeft));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopLeft),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Depth / texScale.X, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomLeft),
                    faceNormal,
                    new Vector2(shapeDesc.Depth / texScale.X, shapeDesc.Height / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomLeft),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Height / texScale.Y)
                    ),
            };
            planes[4] = new CSGPlane(facePlane, faceVertices);

            // Right face
            faceNormal   = Vector3.RIGHT;
            facePlane    = new Plane(faceNormal, shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomRight));
            faceVertices = new[] {
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontTopRight),
                    faceNormal,
                    new Vector2(0f, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackTopRight),
                    faceNormal,
                    new Vector2(shapeDesc.Depth / texScale.X, 0f)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.BackBottomRight),
                    faceNormal,
                    new Vector2(shapeDesc.Depth / texScale.X, shapeDesc.Height / texScale.Y)
                    ),
                new CSGVertex(
                    shapeDesc.GetCorner(Cuboid.CuboidCorner.FrontBottomRight),
                    faceNormal,
                    new Vector2(0f, shapeDesc.Height / texScale.Y)
                    ),
            };
            planes[5] = new CSGPlane(facePlane, faceVertices);
            #endregion

            for (int i = 0; i < planes.Length; ++i)
            {
                planes[i] = planes[i].Transform(transform, shapeDesc.CenterPoint);
            }

            CreateVBAndIB(planes, out vertices, out indices, insideOut);
        }