private void GenerateLeaf(Vector3 position, Quaternion orientation, float leafGrowth) { Quaternion leafOrientation = orientation * Quaternion.Euler(-Species.LeafVerticalAngle, 0, 0); float leafScale = Mathf.Pow(leafGrowth, Species.ScaleExponent); // generate petiole int startVC = mg.VertexCount; mg.SetMaterial(0); List <int> petioleRing = tempIndices.GetNext(); petioleRing.Clear(); petioleRing.Add(mg.AddVertex(Vector3.left * Species.PetioleWidth * 0.5f)); petioleRing.Add(mg.AddVertex(Vector3.right * Species.PetioleWidth * 0.5f)); petioleRing.Add(mg.AddVertex(Vector3.down * Species.PetioleDepth)); int petioleEndPoint = mg.AddVertex(new Vector3(0, 0, Species.PetioleLength)); for (int i = 0; i < 3; i++) { int j = (i + 1) % 3; mg.AddFace(petioleEndPoint, petioleRing[j], petioleRing[i]); } // generate blade int bladeStartVC = mg.VertexCount; mg.SetMaterial(1); // blade front faces float bladeX = Mathf.Cos(Species.BladeFoldAngle * Mathf.Deg2Rad) * Species.BladeWidth * 0.5f; float bladeY = Mathf.Sin(Species.BladeFoldAngle * Mathf.Deg2Rad) * Species.BladeWidth * 0.5f; Vector3 bladeLeftPos = new Vector3(-bladeX, bladeY, Species.BladeLength * 0.5f); Vector3 bladeRightPos = new Vector3(bladeX, bladeY, Species.BladeLength * 0.5f); Vector3 bladeTipPos = new Vector3(0, 0, Species.BladeLength); int bladeBase = mg.AddVertex(Vector3.zero); int bladeTip = mg.AddVertex(bladeTipPos); int bladeLeft = mg.AddVertex(bladeLeftPos); int bladeRight = mg.AddVertex(bladeRightPos); mg.AddFace(bladeBase, bladeTip, bladeRight); mg.AddFace(bladeBase, bladeLeft, bladeTip); // blade back faces bladeBase = mg.AddVertex(Vector3.zero); bladeTip = mg.AddVertex(bladeTipPos); bladeLeft = mg.AddVertex(bladeLeftPos); bladeRight = mg.AddVertex(bladeRightPos); mg.AddFace(bladeBase, bladeRight, bladeTip); mg.AddFace(bladeBase, bladeTip, bladeLeft); // orient and position leaf int endVC = mg.VertexCount; mg.TranslateVertices(bladeStartVC, endVC, new Vector3(0, 0, Species.PetioleLength * Species.BladePosition)); mg.ScaleVertices(startVC, endVC, leafScale); mg.RotateVertices(startVC, endVC, leafOrientation); mg.TranslateVertices(startVC, endVC, position); }