//----------------------------------------------------------------------------------- private void GetFieldLocators(CNFieldController fieldController, out Vector3[] arrLocations) { GameObject[] gameObjects = fieldController.GetUnityGameObjects(); List <Vector3> listLocatorPosition = new List <Vector3>(); switch (Data.CreationMode) { case CNJointGroups.CreationModeEnum.AtLocatorsPositions: for (int i = 0; i < gameObjects.Length; i++) { Transform tr = gameObjects[i].transform; if (tr.childCount == 0) { listLocatorPosition.Add(tr.position); } } break; case CNJointGroups.CreationModeEnum.AtLocatorsBBoxCenters: for (int i = 0; i < gameObjects.Length; ++i) { Renderer renderer = gameObjects[i].GetComponent <Renderer>(); if (renderer != null) { Bounds bbox = renderer.bounds; listLocatorPosition.Add(bbox.center); } } break; case CNJointGroups.CreationModeEnum.AtLocatorsVertexes: for (int i = 0; i < gameObjects.Length; ++i) { GameObject go = gameObjects[i]; MeshFilter meshFilter = go.GetComponent <MeshFilter>(); if (meshFilter != null && meshFilter.sharedMesh != null) { UnityEngine.Mesh mesh = meshFilter.sharedMesh; UnityEngine.Mesh meshTransformed; CarGeometryUtils.CreateMeshTransformed(mesh, go.transform.localToWorldMatrix, out meshTransformed); Vector3[] meshVertices = meshTransformed.vertices; for (int j = 0; j < meshVertices.Length; ++j) { listLocatorPosition.Add(meshVertices[j]); } UnityEngine.Object.DestroyImmediate(meshTransformed); } } break; default: break; } arrLocations = listLocatorPosition.ToArray(); }
public void Weld() { GameObject[] arrGOtoWeld = FieldController.GetUnityGameObjects(); int arrGOtoWeld_size = arrGOtoWeld.Length; if (arrGOtoWeld_size == 0) { EditorUtility.DisplayDialog("CaronteFX", "Input objects are mandatory", "Ok"); return; } GameObject[] arrWeldedObject; Mesh[] arrWeldedMesh; EditorUtility.DisplayProgressBar(Data.Name, "Welding...", 1.0f); CarGeometryUtils.WeldObjects(arrGOtoWeld, Data.Name, out arrWeldedObject, out arrWeldedMesh); EditorUtility.ClearProgressBar(); if (CarVersionChecker.IsFreeVersion() && arrWeldedObject == null) { EditorUtility.DisplayDialog("CaronteFX - Free version", "CaronteFX Free version can only weld the meshes included in the example scenes and the unity primitives (cube, plane, sphere, etc.).", "Ok"); } if (arrWeldedObject != null) { DeleteOldObjects(); List <GameObject> listWeldedObjects = new List <GameObject>(); listWeldedObjects.AddRange(arrWeldedObject); Bounds bounds = CarEditorUtils.GetGlobalBoundsWorld(listWeldedObjects); GameObject go = new GameObject(Data.Name + "_output"); go.transform.position = bounds.center; foreach (GameObject weldedGO in listWeldedObjects) { weldedGO.transform.parent = go.transform; } if (Data.WeldGameObject != null) { go.transform.parent = Data.WeldGameObject.transform.parent; Object.DestroyImmediate(Data.WeldGameObject); } Data.WeldGameObject = go; Data.ArrWeldedGO = arrWeldedObject; Data.ArrWeldedMesh = arrWeldedMesh; EditorUtility.SetDirty(Data); UnityEditor.Selection.activeGameObject = Data.WeldGameObject; } }
public void Tessellate() { GameObject[] arrGOtoTessellate = FieldController.GetUnityGameObjects(); GameObject[] arrGOTessellated; Mesh[] arrMeshTessellated; if (arrGOtoTessellate.Length == 0) { EditorUtility.DisplayDialog("CaronteFX", "Please, first add some objects to tessellate to the field.", "Ok"); return; } EditorUtility.DisplayProgressBar(Data.Name, "Tessellating...", 1.0f); CarGeometryUtils.TessellateObjects(arrGOtoTessellate, Data.MaxEdgeDistance, Data.LimitByMeshDimensions, out arrGOTessellated, out arrMeshTessellated); EditorUtility.ClearProgressBar(); if (CarVersionChecker.IsFreeVersion() && arrGOTessellated == null) { EditorUtility.DisplayDialog("CaronteFX - Free version", "CaronteFX Free version can only tessellate the meshes included in the example scenes and the unity primitives (cube, plane, sphere, etc.).", "Ok"); } if (arrGOTessellated != null) { DeleteOldObjects(); List <GameObject> listGameObject = new List <GameObject>(); listGameObject.AddRange(arrGOTessellated); Bounds bounds = CarEditorUtils.GetGlobalBoundsWorld(listGameObject); GameObject nodeGO = new GameObject(Data.Name); nodeGO.transform.position = bounds.center; foreach (GameObject go in arrGOTessellated) { go.transform.parent = nodeGO.transform; } if (Data.NodeGO != null) { nodeGO.transform.parent = Data.NodeGO.transform.parent; Object.DestroyImmediate(Data.NodeGO); } Data.NodeGO = nodeGO; Data.ArrTessellatedGO = arrGOTessellated; Data.ArrTessellatedMesh = arrMeshTessellated; EditorUtility.SetDirty(Data); Selection.activeGameObject = nodeGO; } }
public CarCreationData(GameObject go, Mesh renderMesh, Mesh colliderMesh, CRBalltreeAsset btAsset, bool isRope) { gameObject_ = go; isRope_ = isRope; positionRotationCanBeUpdated_ = true; renderFingerprint_ = null; colliderFingerprint_ = null; btAsset_ = btAsset; if (renderMesh != null) { renderFingerprint_ = new byte[256]; CarGeometryUtils.CalculateFingerprint(renderMesh, renderFingerprint_); } if (colliderMesh != null) { colliderFingerprint_ = new byte[256]; CarGeometryUtils.CalculateFingerprint(colliderMesh, colliderFingerprint_); } position_ = go.transform.position; rotation_ = go.transform.rotation; lossyScale_ = go.transform.lossyScale; positionCollider_ = Vector3.zero; rotationCollider_ = Quaternion.identity; lossyScaleCollider_ = Vector3.one; Caronte_Fx_Body fxBody = go.GetComponent <Caronte_Fx_Body>(); if (fxBody != null) { colliderType_ = fxBody.ColliderType; hasValidCollider_ = fxBody.HasValidCollider(); if (colliderType_ == Caronte_Fx_Body.EColliderType.CustomGameObject) { GameObject goCollider = fxBody.GetColliderGameObject(); if (goCollider != null) { positionCollider_ = goCollider.transform.position; rotationCollider_ = goCollider.transform.rotation; lossyScaleCollider_ = goCollider.transform.lossyScale; } } } }
private bool AreMeshFingerprintsValid(Caronte_Fx_Body fxBody) { bool isValid = true; if (renderFingerprint_ != null) { Mesh renderMesh; bool isBakedMesh = fxBody.GetRenderMesh(out renderMesh); if (renderMesh == null) { return(false); } CarGeometryUtils.CalculateFingerprint(renderMesh, fingerprintAux_); isValid &= CarGeometryUtils.AreFingerprintsEqual(fingerprintAux_, renderFingerprint_); if (isBakedMesh) { Object.DestroyImmediate(renderMesh); } } if (colliderFingerprint_ != null) { Mesh meshToCheck; bool isBakedMesh = false; if (isRope_) { meshToCheck = fxBody.GetTileMesh(); } else { isBakedMesh = fxBody.GetColliderMesh(out meshToCheck); } if (meshToCheck == null) { return(false); } CarGeometryUtils.CalculateFingerprint(meshToCheck, fingerprintAux_); isValid &= CarGeometryUtils.AreFingerprintsEqual(fingerprintAux_, colliderFingerprint_); if (isBakedMesh) { Object.DestroyImmediate(meshToCheck); } } return(isValid); }
public void CreateHelperMesh() { EditorUtility.DisplayProgressBar(Data.Name, "Creating helper mesh...", 1.0f); MeshSimple helperMesh_un; CaronteSharp.Tools.CreateHelperMesh(Data.RandomSeed, Data.Resolution + 2, Data.NBumps, Data.RadiusMin, Data.RadiusMax, out helperMesh_un); Mesh helperMesh; CarGeometryUtils.CreateMeshFromSimple(helperMesh_un, out helperMesh); helperMesh.name = Data.Name; GameObject go = new GameObject(); go.name = Data.Name; MeshFilter mf = go.AddComponent <MeshFilter>(); mf.sharedMesh = helperMesh; MeshRenderer mr = go.AddComponent <MeshRenderer>(); mr.sharedMaterial = material_; if (Data.HelperGO != null) { go.transform.parent = Data.HelperGO.transform.parent; go.transform.localPosition = Data.HelperGO.transform.localPosition; go.transform.localRotation = Data.HelperGO.transform.localRotation; go.transform.localScale = Data.HelperGO.transform.localScale; Object.DestroyImmediate(Data.HelperGO); } if (Data.HelperMesh != null) { Object.DestroyImmediate(Data.HelperMesh); } Data.HelperMesh = helperMesh; Data.HelperGO = go; EditorUtility.SetDirty(Data); UnityEditor.Selection.activeGameObject = Data.HelperGO; EditorUtility.ClearProgressBar(); }
public void ClassifySelection() { GameObject selectorGO = Data.SelectorGO; if (selectorGO == null) { EditorUtility.DisplayDialog("CaronteFX", "A selector geometry is mandatory", "Ok"); return; } Mesh selectorMesh = selectorGO.GetMesh(); if (selectorMesh == null) { EditorUtility.DisplayDialog("CaronteFX", "A selector geometry is mandatory", "Ok"); return; } EditorUtility.DisplayProgressBar(Data.Name, "Selecting...", 1.0f); GameObject[] arrGOtoClassify = FieldController.GetUnityGameObjects(); Mesh auxSelectorMesh; CarGeometryUtils.CreateMeshTransformed(selectorMesh, selectorGO.transform.localToWorldMatrix, out auxSelectorMesh); MeshSimple auxCropMesh_un = new MeshSimple(); auxCropMesh_un.Set(auxSelectorMesh); Object.DestroyImmediate(auxSelectorMesh); int nGameObjectToClassify = arrGOtoClassify.Length; List <GameObject> listGOToClassify = new List <GameObject>(); List <MeshSimple> listAuxMeshToClassify_un = new List <MeshSimple>(); for (int i = 0; i < nGameObjectToClassify; i++) { GameObject go = arrGOtoClassify[i]; Mesh meshToClassify = go.GetMesh(); if (meshToClassify != null) { listGOToClassify.Add(go); Mesh auxMeshToClassify; CarGeometryUtils.CreateMeshTransformed(meshToClassify, go.transform.localToWorldMatrix, out auxMeshToClassify); MeshSimple auxMeshToClassify_un = new MeshSimple(); auxMeshToClassify_un.Set(auxMeshToClassify); Object.DestroyImmediate(auxMeshToClassify); listAuxMeshToClassify_un.Add(auxMeshToClassify_un); } } int[] arrIdxClassified; CaronteSharp.Tools.SplitInsideOutsideByGeometry(listAuxMeshToClassify_un.ToArray(), auxCropMesh_un, out arrIdxClassified, Data.FrontierPieces, true); List <GameObject> listGameObjectOutside = new List <GameObject>(); List <GameObject> listGameObjectInside = new List <GameObject>(); for (int i = 0; i < arrIdxClassified.Length; i++) { int idxClassified = arrIdxClassified[i]; GameObject go = listGOToClassify[i]; if (idxClassified == 0) { listGameObjectOutside.Add(go); } else if (idxClassified == 1) { listGameObjectInside.Add(go); } } if (Data.SelectionMode == CNSelector.SELECTION_MODE.OUTSIDE) { if (Data.Complementary) { Selection.objects = listGameObjectInside.ToArray(); } else { Selection.objects = listGameObjectOutside.ToArray(); } } else if (Data.SelectionMode == CNSelector.SELECTION_MODE.INSIDE) { if (Data.Complementary) { Selection.objects = listGameObjectOutside.ToArray(); } else { Selection.objects = listGameObjectInside.ToArray(); } } EditorUtility.ClearProgressBar(); }