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); }
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); } }
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(); }