Esempio n. 1
0
        public static MeshDraft GenerateGabled(List <Vector2> roofPolygon, RoofConfig roofConfig)
        {
            Vector3 a = roofPolygon[0].ToVector3XZ() + Vector3.up * roofConfig.thickness;
            Vector3 b = roofPolygon[3].ToVector3XZ() + Vector3.up * roofConfig.thickness;
            Vector3 c = roofPolygon[2].ToVector3XZ() + Vector3.up * roofConfig.thickness;
            Vector3 d = roofPolygon[1].ToVector3XZ() + Vector3.up * roofConfig.thickness;

            Vector3 ridgeHeight = Vector3.up * GabledRoofHeight;
            Vector3 ridge0      = (a + d) / 2 + ridgeHeight;
            Vector3 ridge1      = (b + c) / 2 + ridgeHeight;

            var roofDraft = new MeshDraft();

            roofDraft.AddQuad(a, ridge0, ridge1, b);
            roofDraft.AddTriangle(b, ridge1, c);
            roofDraft.AddQuad(c, ridge1, ridge0, d);
            roofDraft.AddTriangle(d, ridge0, a);
            return(roofDraft);
        }
Esempio n. 2
0
        private void AddBottomLeftTriangle(int x, int y)
        {
            Vector2 bottomLeft = GetBottomLeftPosition(x, y);

            if (contours.useInterpolation)
            {
                draft.AddTriangle(
                    bottomLeft,
                    bottomLeft + Vector2.up * contours.GetLeftSide(x, y) * squareSize,
                    bottomLeft + Vector2.right * contours.GetBottomSide(x, y) * squareSize,
                    normal);
            }
            else
            {
                draft.AddTriangle(
                    bottomLeft,
                    bottomLeft + Vector2.up * cornerWeight * squareSize,
                    bottomLeft + Vector2.right * cornerWeight * squareSize,
                    normal);
            }
        }
Esempio n. 3
0
        void Start()
        {
            if (baseMesh == null)
            {
                baseMesh = GetComponent <MeshFilter>().sharedMesh;
            }

#if UNITY_EDITOR
            var cam = Camera.current;
            if (cam == null || Application.isPlaying)
            {
                cam = Camera.main;
            }
#else
            var cam = Camera.main;
#endif

            var draft = new MeshDraft();

            var rand = new System.Random(0);

            // expend the number of triangles
            var triangles = baseMesh.Triangles();

            var dist      = Vector3.Distance(cam.transform.position, transform.position);
            var lod       = (1f - ((Mathf.Clamp(dist, minDist, maxDist)) - minDist) / (maxDist - minDist));
            var numSplits = lod * maxSplits;
            var height    = lod * maxHeight;

#if DEBUG
            Debug.Log(dist + " : " + numSplits);
#endif

            for (int i = 0; i < numSplits; i++)
            {
                var tmpTriangles = new List <(Vector3 a, Vector3 b, Vector3 c)>();

                foreach (var tri in triangles)
                {
                    var(middle, oposite, first, second) = tri.MiddleLargestSide();
                    tmpTriangles.Add((oposite, first, middle));
                    tmpTriangles.Add((oposite, middle, second));
                }

                triangles = tmpTriangles.ToArray();
            }

            foreach (var tri in triangles)
            {
                var middle  = tri.Middle(((float)rand.NextDouble(), (float)rand.NextDouble(), (float)rand.NextDouble()));
                var normal  = tri.Normal();
                var sideDir = (tri.Item1 - middle).normalized;
                var leanDir = MeshExension.Normal(sideDir, normal);

                var rot = Quaternion.RotateTowards(Quaternion.LookRotation(sideDir, normal), Quaternion.LookRotation(sideDir, normal), (float)rand.NextDouble());

                sideDir = rot * sideDir;
                leanDir = rot * leanDir;

                var a = middle + sideDir * (maxWidth + ((float)rand.NextDouble() - 0.5f) * randWidth);
                var b = middle - sideDir * (maxWidth + ((float)rand.NextDouble() - 0.5f) * randWidth);
                var c = middle + (normal + leanDir * (leanDist + ((float)rand.NextDouble() - 0.5f) * randLeanDist)).normalized * (maxHeight + ((float)rand.NextDouble() - 0.5f) * randHeight);

                //normal = MeshExension.Normal(a, b, c);
                //if (Vector3.Dot(normal, cam.transform.forward) < 0)
                //    normal = -normal;
                //normal = -Camera.main.transform.forward;
                //normal = (Camera.main.transform.position - middle).normalized;

                draft.AddTriangle(a, b, c, -leanDir, -leanDir, normal);
            }

            Grass = draft.ToMesh();
        }