// does this actually work? I feel like it doesn't public void OnDestroy() { if (Application.isEditor) { if ((IvyBehavior)target == null) { // clean up meshes as well if (wasPartOfPrefab && !IvyCore.ConfirmDestroyMeshes()) { return; } if (lastDataAsset != null) { foreach (var meshID in lastMeshIDs) { IvyCore.TryDestroyMesh(meshID, lastDataAsset, false); } IvyCore.needToSaveAssets = true; } } } }
public static void GenerateMesh(IvyGraph ivyGraph, IvyProfile ivyProfile, bool doUV2s = false, bool forceGeneration = false) { // avoid GC allocations by reusing static lists verticesAll.Clear(); texCoordsAll.Clear(); trianglesAll.Clear(); leafVerticesAll.Clear(); leafUVsAll.Clear(); leafTrianglesAll.Clear(); leafColorsAll.Clear(); // the main mesh generation actually happens here; if it can't generate a mesh, then stop if (!GenerateMeshData(ivyGraph, ivyProfile, forceGeneration)) { return; } ivyGraph.dirtyUV2s = !doUV2s; InitOrRefreshRoot(ivyGraph, ivyProfile); var myAsset = IvyCore.GetDataAsset(ivyGraph.rootGO); // Branch mesh debug // Debug.Log( "branchVertices: " + verticesAll.Count ); // Debug.Log( "branchTris: " + string.Join(", ", trianglesAll.Select( tri => tri.ToString() ).ToArray()) ); // foreach ( var vert in verticesAll ) { // Debug.DrawRay( vert + ivyGraph.seedPos, Vector3.up, Color.cyan, 1f, false ); // } if (ivyProfile.ivyBranchSize < 0.0001f) { if (ivyGraph.branchMF != null) { IvyCore.DestroyObject(ivyGraph.branchMF.gameObject); } IvyCore.TryDestroyMesh(ivyGraph.branchMeshID, myAsset, true); } else { CheckMeshDataAsset(ref ivyGraph.branchMeshID, myAsset, ivyProfile.meshCompress); branchMesh = myAsset.meshList[ivyGraph.branchMeshID]; if (ivyGraph.branchMF == null || ivyGraph.branchR == null) { CreateIvyMeshObject(ivyGraph, ivyProfile, branchMesh, false); } RefreshMeshObject(ivyGraph.branchMF, ivyProfile); branchMesh.Clear(); ivyGraph.branchMF.name = ivyGraph.rootGO.name + "_Branches"; ivyGraph.branchR.shadowCastingMode = ivyProfile.castShadows; ivyGraph.branchR.receiveShadows = ivyProfile.receiveShadows; branchMesh.name = ivyGraph.branchMF.name; branchMesh.SetVertices(verticesAll); branchMesh.SetUVs(0, texCoordsAll); if (ivyProfile.useLightmapping && doUV2s) { PackBranchUV2s(ivyGraph); } branchMesh.SetTriangles(trianglesAll, 0); branchMesh.RecalculateBounds(); branchMesh.RecalculateNormals(); branchMesh.RecalculateTangents(); #if UNITY_2017_1_OR_NEWER && UNITY_EDITOR MeshUtility.Optimize(branchMesh); #endif ivyGraph.branchMF.sharedMesh = branchMesh; #if UNITY_EDITOR ivyGraph.branchR.sharedMaterial = ivyProfile.branchMaterial != null ? ivyProfile.branchMaterial : AssetDatabase.GetBuiltinExtraResource <Material>("Default-Diffuse.mat"); #else ivyGraph.branchR.sharedMaterial = ivyProfile.branchMaterial; #endif } // Leaves mesh debug // Debug.Log( "leafVertices: " + ivyGraph.leafVertices.Count ); // Debug.Log( "leafTris: " + string.Join(", ", ivyGraph.leafTriangles.Select( tri => tri.ToString() ).ToArray()) ); // don't do leaf mesh if it's unnecessary if (ivyProfile.leafProbability < 0.001f) { if (ivyGraph.leafMF != null) { IvyCore.DestroyObject(ivyGraph.leafMF.gameObject); } IvyCore.TryDestroyMesh(ivyGraph.leafMeshID, myAsset, true); } else { CheckMeshDataAsset(ref ivyGraph.leafMeshID, myAsset, ivyProfile.meshCompress); leafMesh = myAsset.meshList[ivyGraph.leafMeshID]; if (ivyGraph.leafMF == null || ivyGraph.leafR == null) { CreateIvyMeshObject(ivyGraph, ivyProfile, leafMesh, true); } RefreshMeshObject(ivyGraph.leafMF, ivyProfile); leafMesh.Clear(); ivyGraph.leafMF.name = ivyGraph.rootGO.name + "_Leaves"; ivyGraph.leafR.shadowCastingMode = ivyProfile.castShadows; ivyGraph.leafR.receiveShadows = ivyProfile.receiveShadows; leafMesh.name = ivyGraph.leafMF.name; leafMesh.SetVertices(leafVerticesAll); leafMesh.SetUVs(0, leafUVsAll); if (ivyProfile.useLightmapping && doUV2s) { PackLeafUV2s(ivyGraph); } leafMesh.SetTriangles(leafTrianglesAll, 0); if (ivyProfile.useVertexColors) { leafMesh.SetColors(leafColorsAll); } leafMesh.RecalculateBounds(); leafMesh.RecalculateNormals(); leafMesh.RecalculateTangents(); #if UNITY_2017_1_OR_NEWER && UNITY_EDITOR MeshUtility.Optimize(leafMesh); #endif ivyGraph.leafMF.sharedMesh = leafMesh; #if UNITY_EDITOR ivyGraph.leafR.sharedMaterial = ivyProfile.leafMaterial != null ? ivyProfile.leafMaterial : AssetDatabase.GetBuiltinExtraResource <Material>("Default-Diffuse.mat"); #else ivyGraph.leafR.sharedMaterial = ivyProfile.leafMaterial; #endif } // EditorUtility.SetDirty( myAsset ); // AssetDatabase.SaveAssets(); // AssetDatabase.ImportAsset( AssetDatabase.GetAssetPath(myAsset) ); }