コード例 #1
0
        //-----------------------------------------------------------------------------------
        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();
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
        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;
                    }
                }
            }
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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();
        }