// Start is called before the first frame update void Start() { if (meshObject == null) { meshObject = GetComponent <MeshMerger>(); } }
public static void MergeSelectedMeshes() { if (!Selection.activeGameObject) { Debug.Log("Please Select The Root Node."); } var mergedRenderer = MeshMerger.Batch( Selection.activeGameObject.GetComponentsInChildren <MeshRenderer>(), Selection.activeGameObject.transform ); var assetName = "new-mesh@" + DateTime.Now.GetTimeStamp(); var prefabObj = new GameObject(assetName); prefabObj.transform.position = Selection.activeGameObject.transform.position; mergedRenderer.ForEach( (mr, i) => { var mf = mr.GetComponent <MeshFilter>(); var fullAssetName = assetName + "_" + i; AssetDatabase.CreateAsset(mf.sharedMesh, "Assets/" + fullAssetName + ".asset"); AssetDatabase.SaveAssets(); var mesh = AssetDatabase.LoadAssetAtPath <Mesh>("Assets/" + fullAssetName + ".asset"); mf.sharedMesh = mesh; mr.transform.parent = prefabObj.transform; } ); PrefabUtility.SaveAsPrefabAsset(prefabObj, "Assets/" + assetName + ".prefab"); var obj = PrefabUtility.InstantiatePrefab(PrefabUtility.LoadPrefabContents("Assets/" + assetName + ".prefab")) as GameObject; obj.transform.position = prefabObj.transform.position; Object.DestroyImmediate(prefabObj); }
public override void OnInspectorGUI() { MeshMerger bm = (MeshMerger)target; GUILayout.BeginVertical("box"); if (GUILayout.Button("Organize Buildings")) { bm.DeOrganize(); bm.Organize(); } if (GUILayout.Button("Merge Meshes")) { bm.Unify(); } if (GUILayout.Button("De-Organize")) { bm.DeOrganize(); } if (GUILayout.Button("Clean Unused Objects")) { bm.CleanScene(); } bm.maximizeEfficiency = EditorGUILayout.Toggle(new GUIContent("Maximize Efficiency", "Groups objects to maximize efficiency"), bm.maximizeEfficiency); GUILayout.EndVertical(); }
/// <summary> /// Merges all source objects to one mesh and creates a native trimesh. /// </summary> /// <param name="meshes">Source meshes.</param> /// <returns>Native trimesh.</returns> private agxCollide.Geometry Create(UnityEngine.Mesh[] meshes) { var geometry = new agxCollide.Geometry(); if (m_precomputedCollisionMeshes.Count > 0) { // The vertices are assumed to be stored in local coordinates of the // given transform. For the scale to be correct w var toWorld = transform.localToWorldMatrix; Func <Vector3, Vector3> transformer = v => { return(transform.InverseTransformDirection(toWorld * v.ToLeftHanded())); }; var mode = Options != null ? Options.Mode : CollisionMeshOptions.MeshMode.Trimesh; for (int i = 0; i < m_precomputedCollisionMeshes.Count; ++i) { var collisionMesh = m_precomputedCollisionMeshes[i]; if (collisionMesh == null) { Debug.LogWarning($"AGXUnity.Collide.Mesh: Null precomputed collision mesh at index {i}.", this); continue; } var shape = collisionMesh.CreateShape(transformer, mode); if (shape == null) { Debug.LogWarning($"AGXUnity.Collide.Mesh: Precomputed collision mesh at index {i} resulted in an invalid shape.", this); continue; } geometry.add(shape, GetNativeGeometryOffset()); } } else { if (m_precomputedCollisionMeshes.Count > 0) { Debug.LogWarning("AGXUnity.Mesh: Failed to create shapes from precomputed data - using Trimesh as fallback.", this); } var merger = MeshMerger.Merge(transform, meshes); geometry.add(new agxCollide.Trimesh(merger.Vertices, merger.Indices, "AGXUnity.Mesh: Trimesh"), GetNativeGeometryOffset()); } if (geometry.getShapes().Count == 0) { geometry.Dispose(); geometry = null; } return(geometry); }
// Use this for initialization void Awake() { mergedMeshObject = GameObject.Find(mergedMeshObjectName).GetComponent("MeshMerger") as MeshMerger; if (mergedMeshObject == null) { Debug.LogError("Can't find merged mesh object in MergeStaticMeshPeices.cs, Start()"); } foreach (MeshFilter filter in meshesToMerge) { mergedMeshObject.AddMeshFilterToMerge(filter); } }
private MeshMerger mergedMeshObject; //set in awake with .find() #endregion Fields #region Methods // Use this for initialization void Awake() { mergedMeshObject = GameObject.Find(mergedMeshObjectName).GetComponent("MeshMerger") as MeshMerger; if(mergedMeshObject == null) { Debug.LogError("Can't find merged mesh object in MergeStaticMeshPeices.cs, Start()"); } foreach(MeshFilter filter in meshesToMerge) { mergedMeshObject.AddMeshFilterToMerge(filter); } }
// float range = 30; void OnEnable() { MeshMerger um = (MeshMerger)target; }
/// <summary> /// Merges all source objects to one mesh and creates a native trimesh. /// </summary> /// <param name="meshes">Source meshes.</param> /// <returns>Native trimesh.</returns> private agxCollide.Mesh Create(UnityEngine.Mesh[] meshes) { var merger = MeshMerger.Merge(transform, meshes); return(new agxCollide.Trimesh(merger.Vertices, merger.Indices, "Trimesh")); }