private TreeFunctionAsset ToTrunkFunction(TreeFunctionAsset parent) { TrunkFunction function = ScriptableObject.CreateInstance <TrunkFunction>(); function.Init(parent); function.number = Tnumber; function.displacementSize = TdisplacementSize; function.displacementStrength = TdisplacementStrength; function.seed = seed; function.flareNumber = TflareNumber; function.heightOffset = TheightOffset; function.length = Tlength; function.originAttraction = ToriginAttraction; function.radius = Tradius; function.radiusMultiplier = TradiusMultiplier; function.randomness = Trandomness; function.resolution = Tresolution; function.rootHeight = TrootHeight; function.rootInnerRadius = TrootInnerRadius; function.rootRadius = TrootRadius; function.rootResolution = TrootResolution; function.rootShape = TrootShape; function.spinAmount = TspinAmount; return(function); }
public void GenerateMeshData(TrunkFunction trunk, float simplifyLeafs, float radialResolution, float VColBarkModifier, float VColLeafModifier) { Stack <Queue <TreePoint> > treePoints = new Stack <Queue <TreePoint> >(); foreach (Node stem in stems) { Stack <Queue <TreePoint> > newPoints = stem.ToSplines(); while (newPoints.Count > 0) { treePoints.Push(newPoints.Pop()); } } Splines splines = new Splines(treePoints); splines.GenerateMeshData(7 * radialResolution, 3, trunk.rootShape, trunk.radiusMultiplier, trunk.rootRadius, trunk.rootInnerRadius, trunk.rootHeight, trunk.rootResolution , trunk.flareNumber, trunk.displacementStrength, trunk.displacementSize, trunk.spinAmount, VColBarkModifier); Queue <int> leafTriangles = new Queue <int>(); GenerateLeafData(splines.verts, splines.normals, splines.uvs, leafTriangles, splines.verts.Count, splines.colors, simplifyLeafs, VColBarkModifier, VColLeafModifier); verts = splines.verts.ToArray(); normals = splines.normals.ToArray(); uvs = splines.uvs.ToArray(); triangles = splines.triangles.ToArray(); colors = splines.colors.ToArray(); this.leafTriangles = leafTriangles.ToArray(); }
void UpdateBranch(bool normalShader = false) { switch (texSize) { case EnumTextureSize._512: textureSize = 512; break; case EnumTextureSize._1024: textureSize = 1024; break; case EnumTextureSize._2048: textureSize = 2048; break; case EnumTextureSize._4096: textureSize = 4096; break; } if (branchObject == null) { CreateBranchObject(normalShader); } if (!deadLeafsRendering) { CreateLeafMesh(); } MTree branch = new MTree(branchObject.transform); TrunkFunction trunkFunction = ScriptableObject.CreateInstance <TrunkFunction>(); trunkFunction.Init(null); float resolution = 20; Random.InitState(seed); branch.AddTrunk(Vector3.up, Vector3.forward, stemLength, AnimationCurve.Linear(0, 1, 1, .3f), radius, resolution, randomness / 3, 0, AnimationCurve.Linear(0, 1, 0, 0), 0, .01f, 1, 0); branch.TwigSplit(branchNumber, angle * 90f, .9f, 0f); branch.Grow(length, AnimationCurve.Linear(0, 1, 1, 1), resolution, splitProba, AnimationCurve.Linear(0, 1, 1, 1), angle, 2, 1, 1, randomness, AnimationCurve.Linear(0, 1, 1, .4f), .9f, 0f, 0f, 1f, 0.00001f); if (!deadLeafsRendering) { branch.AddLeafs(leafCovering, leafNumber, new Mesh[] { leafMesh }, leafSize, false, 0, 0, 1, leafAngle, false, 0, 0, 0, 0); } Mesh mesh = CreateBranchMesh(branch, trunkFunction); branchObject.GetComponent <MeshFilter>().mesh = mesh; if (cameraObject == null) { CreateCameraObject(); } RenderCamera(); DestoyObjects(); }
Mesh CreateBranchMesh(MTree branch, TrunkFunction trunkFunction) { Mesh mesh = new Mesh(); branch.GenerateMeshData(trunkFunction, 0, 1, 1, 1); mesh.vertices = branch.verts; mesh.normals = branch.normals; mesh.uv = branch.uvs; Color[] colors = branch.colors; mesh.triangles = branch.triangles; if (branch.leafTriangles.Length > 0) { mesh.subMeshCount = 2; mesh.SetTriangles(branch.leafTriangles, 1); } mesh.colors = colors; return(mesh); }