Ejemplo n.º 1
0
        void TriangulateCornerCliffTerraces(
            Vector3 bottom, HexCell bottomCell,
            Vector3 left, HexCell leftCell,
            Vector3 right, HexCell rightCell)
        {
            float   b             = Mathf.Abs(1f / (leftCell.elevation - bottomCell.elevation));
            Vector3 boundary      = Vector3.Lerp(HexMetrics.Perturb(bottom), HexMetrics.Perturb(left), b);
            Color   boundaryColor = Color.Lerp(color1, color2, b);

            Vector3 types;

            types.x = bottomCell.terrainTypeIndex;
            types.y = leftCell.terrainTypeIndex;
            types.z = rightCell.terrainTypeIndex;

            TriangulateBoundaryTriangle(
                right, color3, bottom, color1, boundary, boundaryColor, types);

            if (leftCell.GetEdgeType(rightCell) == HexEdgeType.Slope)
            {
                TriangulateBoundaryTriangle(
                    left, color2, right, color3, boundary, boundaryColor, types);
            }
            else
            {
                terrain.AddTriangleUnperturbed(HexMetrics.Perturb(left), HexMetrics.Perturb(right), boundary);
                terrain.AddTriangleColor(color2, color3, boundaryColor);
                terrain.AddTriangleTerrainTypes(types);
            }
        }
Ejemplo n.º 2
0
        void TriangulateBoundaryTriangle(
            Vector3 bottom, Color beginColor,
            Vector3 left, Color leftColor,
            Vector3 boundary, Color boundaryColor, Vector3 types)
        {
            Vector3 v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(bottom, left, 1));
            Color   c2 = HexMetrics.TerraceLerp(beginColor, leftColor, 1);

            terrain.AddTriangleUnperturbed(HexMetrics.Perturb(bottom), v2, boundary);
            terrain.AddTriangleColor(beginColor, c2, boundaryColor);
            terrain.AddTriangleTerrainTypes(types);

            for (int i = 2; i < HexMetrics.terracedSteps; i++)
            {
                Vector3 v1 = v2;
                Color   c1 = c2;

                v2 = HexMetrics.Perturb(HexMetrics.TerraceLerp(bottom, left, i));
                c2 = HexMetrics.TerraceLerp(beginColor, leftColor, i);

                terrain.AddTriangleUnperturbed(v1, v2, boundary);
                terrain.AddTriangleColor(c1, c2, boundaryColor);
                terrain.AddTriangleTerrainTypes(types);
            }

            terrain.AddTriangleUnperturbed(v2, HexMetrics.Perturb(left), boundary);
            terrain.AddTriangleColor(c2, leftColor, boundaryColor);
            terrain.AddTriangleTerrainTypes(types);
        }
Ejemplo n.º 3
0
        public void AddTriangle(Vector3 v1, Vector3 v2, Vector3 v3)
        {
            int vertexIndex = m_Vertices.Count;

            m_Vertices.Add(HexMetrics.Perturb(v1));
            m_Vertices.Add(HexMetrics.Perturb(v2));
            m_Vertices.Add(HexMetrics.Perturb(v3));
            m_Triangles.Add(vertexIndex);
            m_Triangles.Add(vertexIndex + 1);
            m_Triangles.Add(vertexIndex + 2);
        }
Ejemplo n.º 4
0
        public void AddSpecialFeature(HexCell cell, Vector3 position)
        {
            if (cell.specialIndex == 0)
            {
                return;                         // shouldn't happen, but guard against it all the same.)
            }
            position = HexMetrics.Perturb(position);
            var hash     = HexMetrics.SampleHashGrid(position);
            var rotation = Quaternion.Euler(0f, 360f * hash.e, 0f);

            Instantiate(special[cell.specialIndex - 1], position, rotation, m_Container);
        }
Ejemplo n.º 5
0
        public void AddBridge(Vector3 roadCenter1, Vector3 roadCenter2)
        {
            roadCenter1 = HexMetrics.Perturb(roadCenter1);
            roadCenter2 = HexMetrics.Perturb(roadCenter2);
            var bridgePos = (roadCenter1 + roadCenter2) * 0.5f;
            var bridgeRot = Quaternion.FromToRotation(Vector3.forward, roadCenter2 - roadCenter1);
            var newBridge = Instantiate(bridge, bridgePos, bridgeRot, m_Container);
            var length    = Vector3.Distance(roadCenter1, roadCenter2);

            newBridge.localScale = new Vector3(
                1f, 1f, length * (1f / HexMetrics.bridgeDesignLength));
        }
Ejemplo n.º 6
0
        void AddWallSegment(Vector3 nearLeft, Vector3 farLeft, Vector3 nearRight, Vector3 farRight, bool addTower = false)
        {
            // pre-perturb our vertices
            nearLeft  = HexMetrics.Perturb(nearLeft);
            nearRight = HexMetrics.Perturb(nearRight);
            farLeft   = HexMetrics.Perturb(farLeft);
            farRight  = HexMetrics.Perturb(farRight);

            var left  = HexMetrics.WallLerp(nearLeft, farLeft);
            var right = HexMetrics.WallLerp(nearRight, farRight);

            var leftThicknessOffset =
                HexMetrics.WallThicknessOffset(nearLeft, farLeft);
            var rightThicknessOffset =
                HexMetrics.WallThicknessOffset(nearRight, farRight);

            var leftTop  = left.y + HexMetrics.wallHeight;
            var rightTop = right.y + HexMetrics.wallHeight;

            Vector3 v1, v2, v3, v4;

            v1   = v3 = left - leftThicknessOffset;
            v2   = v4 = right - rightThicknessOffset;
            v3.y = leftTop;
            v4.y = rightTop;
            walls.AddQuadUnperturbed(v1, v2, v3, v4);

            Vector3 t1 = v3, t2 = v4;

            // make the wall double-sided
            v1   = v3 = left + leftThicknessOffset;
            v2   = v4 = right + rightThicknessOffset;
            v3.y = leftTop;
            v4.y = rightTop;
            walls.AddQuadUnperturbed(v2, v1, v4, v3);

            // add a wall top too!
            walls.AddQuadUnperturbed(t1, t2, v3, v4);

            if (!addTower)
            {
                return;
            }

            var towerPos = (left + right) * 0.5f;
            var rightDir = right - left;

            rightDir.y = 0;
            var towerRot = Quaternion.FromToRotation(Vector3.right, rightDir);

            Instantiate(wallTower, towerPos, towerRot, m_Container);
        }
Ejemplo n.º 7
0
        void AddWallCap(Vector3 near, Vector3 far)
        {
            near = HexMetrics.Perturb(near);
            far  = HexMetrics.Perturb(far);

            var center    = HexMetrics.WallLerp(near, far);
            var thickness = HexMetrics.WallThicknessOffset(near, far);

            Vector3 v1, v2, v3, v4;

            v1   = v3 = center - thickness;
            v2   = v4 = center + thickness;
            v3.y = v4.y = center.y + HexMetrics.wallHeight;
            walls.AddQuadUnperturbed(v1, v2, v3, v4);
        }
Ejemplo n.º 8
0
        public void AddQuad(Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4)
        {
            var index = m_Vertices.Count;

            m_Vertices.Add(HexMetrics.Perturb(v1));
            m_Vertices.Add(HexMetrics.Perturb(v2));
            m_Vertices.Add(HexMetrics.Perturb(v3));
            m_Vertices.Add(HexMetrics.Perturb(v4));
            m_Triangles.Add(index);     // v1
            m_Triangles.Add(index + 2); // v3
            m_Triangles.Add(index + 1); // v2
            m_Triangles.Add(index + 1); // v2
            m_Triangles.Add(index + 2); // v3
            m_Triangles.Add(index + 3); // v4
        }
Ejemplo n.º 9
0
        void TriangulateWaterfallInWater(
            Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, float y1, float y2, float waterY)
        {
            v1.y = v2.y = y1;
            v3.y = v4.y = y2;
            v1   = HexMetrics.Perturb(v1);
            v2   = HexMetrics.Perturb(v2);
            v3   = HexMetrics.Perturb(v3);
            v4   = HexMetrics.Perturb(v4);
            float t = (waterY - y2) / (y1 - y2);

            v3 = Vector3.Lerp(v3, v1, t);
            v4 = Vector3.Lerp(v4, v2, t);
            rivers.AddQuadUnperturbed(v1, v2, v3, v4);
            rivers.AddQuadUV(0f, 1f, 0.8f, 1f);
        }
Ejemplo n.º 10
0
        public void AddFeature(HexCell cell, Vector3 position)
        {
            if (cell.isSpecial)
            {
                return;
            }
            var   hash        = HexMetrics.SampleHashGrid(position);
            var   prefab      = PickPrefab(urbanCollections, cell.urbanLevel, hash.a, hash.d);
            var   otherPrefab = PickPrefab(farmCollections, cell.farmLevel, hash.b, hash.d);
            float usedHash    = hash.a;

            if (prefab)
            {
                if (otherPrefab && hash.b < usedHash)
                {
                    prefab   = otherPrefab;
                    usedHash = hash.b;
                }
            }
            else if (otherPrefab)
            {
                prefab   = otherPrefab;
                usedHash = hash.b;
            }
            otherPrefab = PickPrefab(plantCollections, cell.plantLevel, hash.c, hash.d);
            if (prefab)
            {
                if (otherPrefab && hash.c < usedHash)
                {
                    prefab = otherPrefab;
                }
            }
            else if (otherPrefab)
            {
                prefab = otherPrefab;
            }
            else
            {
                return;
            }

            var instance = Instantiate(prefab, m_Container, false);

            position.y            += instance.localScale.y * 0.5f;
            instance.localPosition = HexMetrics.Perturb(position);
            instance.localRotation = Quaternion.Euler(0f, 360f * hash.e, 0f);
        }
Ejemplo n.º 11
0
        void AddWallWedge(Vector3 near, Vector3 far, Vector3 point)
        {
            near  = HexMetrics.Perturb(near);
            far   = HexMetrics.Perturb(far);
            point = HexMetrics.Perturb(point);

            var center    = HexMetrics.WallLerp(near, far);
            var thickness = HexMetrics.WallThicknessOffset(near, far);

            Vector3 v1, v2, v3, v4;
            var     pointTop = point;

            point.y = center.y;

            v1   = v3 = center - thickness;
            v2   = v4 = center + thickness;
            v3.y = v4.y = pointTop.y = center.y + HexMetrics.wallHeight;
            walls.AddQuadUnperturbed(v1, point, v3, pointTop);
            walls.AddQuadUnperturbed(point, v2, pointTop, v4);
            walls.AddTriangleUnperturbed(pointTop, v3, v4);
        }