Beispiel #1
0
        void Start()
        {
            PointList        pointsA = PrimitiveBuilder.CreateUnitTile();
            PointList        pointsB = pointsA.Translate(0.2f * Vector3.up);
            List <PointList> list    = pointsB.Divide(3, 3);

            MeshBuilder builder = new MeshBuilder();

            builder.Cap(pointsA.Bridge(pointsB, PointList.BridgeMode.CloseReuse));

            foreach (PointList points in list)
            {
                DigHole(points, builder);
            }

            builder.Cap(pointsA.Reverse());
            Mesh mesh = builder.Build();

            NodeBuilder.SetMesh(gameObject, mesh);
        }
Beispiel #2
0
        private GameObject CreateUnitTileHop(float x, float z)
        {
            GameObject obj = CreateChild(x, z);

            MeshBuilder      builder = new MeshBuilder();
            PointList        pointsA = PrimitiveBuilder.CreateUnitTile();
            PointList        pointsB = pointsA.Translate(Vector3.up);
            List <PointList> list    = pointsA.Bridge(pointsB, PointList.BridgeMode.CloseReuse);

            list.Add(pointsA.Reverse());
            list.Add(pointsB);
            foreach (PointList points in list)
            {
                Extend(points, builder);
            }
            Mesh mesh = builder.Build();

            NodeBuilder.SetMesh(obj, mesh);
            return(obj);
        }
Beispiel #3
0
        public List <PointList> Bridge(PointList pointsB, BridgeMode mode = BridgeMode.Open)
        {
            List <PointList> list = new List <PointList> ();

            if (Count != pointsB.Count)
            {
                Debug.LogError("PointList : Cannot Bridge PointLists of different size (" + Count + " / " + pointsB.Count + ")");
            }
            else
            {
                // Add top points
                int iMax = this.Count - 1;
                if (mode == BridgeMode.CloseReuse)
                {
                    iMax++;
                }

                for (int i = 0; i < iMax; i++)
                {
                    // Add side points
                    PointList points = new PointList();
                    points.Copy(this, i);
                    points.Copy(this, (i + 1) % this.Count);
                    points.Copy(pointsB, (i + 1) % this.Count);
                    points.Copy(pointsB, i);
                    list.Add(points);
                }

                if (mode == BridgeMode.CloseDuplicate)
                {
                    PointList points = new PointList();
                    points.Copy(this, iMax);
                    points.Add(this [0]);
                    points.Add(pointsB [0]);
                    points.Copy(pointsB, iMax);
                    list.Add(points);
                }
            }

            return(list);
        }
Beispiel #4
0
        void Start()
        {
            MeshBuilder builder = new MeshBuilder();

            // Create a cube
            PointList        pointsA = PrimitiveBuilder.CreateUnitTile();
            PointList        pointsB = pointsA.Translate(Vector3.up);
            List <PointList> list    = pointsA.Bridge(pointsB, PointList.BridgeMode.CloseReuse);

            list.Add(pointsA.Reverse());
            list.Add(pointsB);

            // Call Branch() on each face
            foreach (PointList points in list)
            {
                Branch(points, builder, 5);
            }
            Mesh mesh = builder.Build();

            NodeBuilder.SetMesh(gameObject, mesh);
        }
Beispiel #5
0
        private static PointList CreateXZRectangle(float xSize, float zSize, AxisSide axisSide, float axisCoord)
        {
            PointList result = new PointList();

            float x = xSize * 0.5f;
            float z = zSize * 0.5f;

            if (axisSide == AxisSide.Negative)
            {
                result.Add(-x, axisCoord, z);
                result.Add(-x, axisCoord, -z);
                result.Add(x, axisCoord, -z);
                result.Add(x, axisCoord, z);
            }
            else
            {
                result.Add(-x, axisCoord, z);
                result.Add(x, axisCoord, z);
                result.Add(x, axisCoord, -z);
                result.Add(-x, axisCoord, -z);
            }

            return(result);
        }
        public void TestCreate()
        {
            PointList list = new PointList();

            Assert.IsNotNull(list);
        }
Beispiel #7
0
 //
 // Copy a point from another PointList and preserve point uid, see Bridge(), Reverse(), Shift()  methods
 //
 public void Copy(PointList list, int index)
 {
     m_points.Add(list.m_points[index]);
     m_uids.Add(list.m_uids[index]);
 }
Beispiel #8
0
 // Init with 1:1 scale between geometry space and uv space, and no rotation
 // Enough to set uVec and vVec, uCst and vCst are left as is
 public void InitLastSideU(PointList points)
 {
     uVec = (points [points.Count - 1] - points [0]).normalized;
     vVec = Vector3.Cross(uVec, points.ComputeNormal()).normalized;
 }
Beispiel #9
0
 // Init with 1:1 scale between geometry space and uv space, and no rotation
 // Enough to set uVec and vVec, uCst and vCst are left as is
 public void InitFirstSideV(PointList points)
 {
     vVec = (points [1] - points [0]).normalized;
     uVec = Vector3.Cross(points.ComputeNormal(), vVec).normalized;
 }
Beispiel #10
0
        private static List <PointList> BridgeRectangleToRoundRectangle(PointList rect, PointList roundRect)
        {
            int pointsPerCorner = roundRect.Count / 4;

            List <PointList> list = new List <PointList> ();

            // Corner 1
            for (int i = 1; i < pointsPerCorner; i++)
            {
                PointList points = new PointList();
                points.Copy(rect, 0);
                points.Copy(roundRect, i);
                points.Copy(roundRect, i - 1);
                list.Add(points);
            }

            // Corner 2
            for (int i = 1; i < pointsPerCorner; i++)
            {
                PointList points = new PointList();
                points.Copy(rect, 1);
                points.Copy(roundRect, pointsPerCorner + i);
                points.Copy(roundRect, pointsPerCorner + i - 1);
                list.Add(points);
            }

            // Corner 3
            for (int i = 1; i < pointsPerCorner; i++)
            {
                PointList points = new PointList();
                points.Copy(rect, 2);
                points.Copy(roundRect, 2 * pointsPerCorner + i);
                points.Copy(roundRect, 2 * pointsPerCorner + i - 1);
                list.Add(points);
            }

            // Corner 4
            for (int i = 1; i < pointsPerCorner; i++)
            {
                PointList points = new PointList();
                points.Copy(rect, 3);
                points.Copy(roundRect, 3 * pointsPerCorner + i);
                points.Copy(roundRect, 3 * pointsPerCorner + i - 1);
                list.Add(points);
            }

            // Sides
            for (int i = 1; i <= 4; i++)
            {
                PointList points = new PointList();
                points.Copy(rect, i % 4);
                points.Copy(roundRect, (i * pointsPerCorner) % roundRect.Count);
                points.Copy(roundRect, (i * pointsPerCorner - 1) % roundRect.Count);
                points.Copy(rect, (i - 1) % 4);

                list.Add(points);
            }

            return(list);
        }
Beispiel #11
0
 private static List <PointList> BridgeRoundRectangleToRectangle(PointList roundRect, PointList rect)
 {
     return(BridgeRectangleToRoundRectangle(rect.Reverse(), roundRect.Reverse()));
 }
Beispiel #12
0
        private static PointList CreateXZRoundRectangle(float xSize, float zSize, float radius, int cornerSides, AxisSide axisSide, float axisCoord)
        {
            PointList result = new PointList();

            float x = xSize * 0.5f - radius;
            float z = zSize * 0.5f - radius;

            float PI_2         = Mathf.PI * 0.5f;
            float indexToAngle = PI_2 / cornerSides;

            if (axisSide == AxisSide.Negative)
            {
                // Corner 1
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = PI_2 + i * indexToAngle;
                    result.Add(-x + radius * Mathf.Cos(angle), axisCoord, z + radius * Mathf.Sin(angle));
                }

                // Corner 2
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = Mathf.PI + i * indexToAngle;
                    result.Add(-x + radius * Mathf.Cos(angle), axisCoord, -z + radius * Mathf.Sin(angle));
                }

                // Corner 3
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = -PI_2 + i * indexToAngle;
                    result.Add(x + radius * Mathf.Cos(angle), axisCoord, -z + radius * Mathf.Sin(angle));
                }

                // Corner 4
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = i * indexToAngle;
                    result.Add(x + radius * Mathf.Cos(angle), axisCoord, z + radius * Mathf.Sin(angle));
                }
            }
            else
            {
                // Corner 1
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = Mathf.PI - i * indexToAngle;
                    result.Add(-x + radius * Mathf.Cos(angle), axisCoord, z + radius * Mathf.Sin(angle));
                }

                // Corner 4
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = PI_2 - i * indexToAngle;
                    result.Add(x + radius * Mathf.Cos(angle), axisCoord, z + radius * Mathf.Sin(angle));
                }

                // Corner 3
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = -i * indexToAngle;
                    result.Add(x + radius * Mathf.Cos(angle), axisCoord, -z + radius * Mathf.Sin(angle));
                }

                // Corner 2
                for (int i = 0; i < cornerSides + 1; i++)
                {
                    float angle = -PI_2 - i * indexToAngle;
                    result.Add(-x + radius * Mathf.Cos(angle), axisCoord, -z + radius * Mathf.Sin(angle));
                }
            }

            return(result);
        }
Beispiel #13
0
 //
 // Find the best Axis Aligned UV Mapper
 //
 public static void ComputeUVMapper(ref PointList points)
 {
     points.UVMapper = ComputeUVMapper(points);
 }