public void AddGameObject(GameObject go, GameObject bakedBone)
        {
            Mesh mesh = go.GetMesh();

            if (mesh != null)
            {
                Matrix4x4 m_LOCAL_to_WORLD         = go.transform.localToWorldMatrix;
                Matrix4x4 m_LOCAL_to_LOCALCOMBINED = m_WORLD_to_LOCALCOMBINED_ * m_LOCAL_to_WORLD;

                Mesh meshAux;
                CRGeometryUtils.CreateMeshTransformed(mesh, m_LOCAL_to_LOCALCOMBINED, out meshAux);

                Vector3[] arrVertex  = meshAux.vertices;
                Vector3[] arrNormal  = meshAux.normals;
                Vector2[] arrUV      = meshAux.uv;
                Vector4[] arrTangent = meshAux.tangents;

                Renderer rn = go.GetComponent <Renderer>();
                if (rn != null)
                {
                    Material[] arrMaterial = rn.sharedMaterials;
                    AddMaterials(arrMaterial);
                }

                AddMesh(go, bakedBone, meshAux, arrVertex, arrNormal, arrUV, arrTangent);
                goOffset++;

                UnityEngine.Object.DestroyImmediate(meshAux);
            }
        }
        //-----------------------------------------------------------------------------------
        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;

                        CRGeometryUtils.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();
        }
        private bool ChopModeGeometry(ChopRequest cr)
        {
            if ((Data.ChopGeometry == null) || !Data.ChopGeometry.HasMesh() || Data.NDesiredPieces <= 0)
            {
                return(false);
            }

            Matrix4x4 m_Local_to_World = Data.ChopGeometry.transform.localToWorldMatrix;

            UnityEngine.Mesh un_chopGeometry = Data.ChopGeometry.GetMesh();

            UnityEngine.Mesh transformedMesh;
            CRGeometryUtils.CreateMeshTransformed(un_chopGeometry, m_Local_to_World, out transformedMesh);

            CaronteSharp.MeshSimple car_chopGeometry = new CaronteSharp.MeshSimple();
            car_chopGeometry.Set(transformedMesh);
            Object.DestroyImmediate(transformedMesh);

            cr.nDesiredPieces_    = (uint)Data.NDesiredPieces;
            cr.meshFocusGeometry_ = car_chopGeometry;
            cr.focusMode_         = (PSBG_FOCUS_MODE)Data.FocusMode;
            cr.gridResolution_    = (uint)Data.GridResolution;
            cr.densityRate_       = Data.DensityRate;
            cr.transitionLength_  = Data.TransitionLength;
            cr.doExtrusionEffect_ = Data.DoExtrusionEffect;
            cr.doCoordinate_      = Data.DoCoordinate;

            return(true);
        }
        private WeldRequest GetWeldRequest()
        {
            WeldRequest wr = new WeldRequest();

            GameObject go = Data.CropGeometry;

            if (go != null)
            {
                Mesh mesh = go.GetMesh();

                if (mesh != null)
                {
                    UnityEngine.Mesh transformedMesh;

                    Matrix4x4 m_Local_to_World = go.transform.localToWorldMatrix;
                    CRGeometryUtils.CreateMeshTransformed(mesh, m_Local_to_World, out transformedMesh);

                    MeshSimple cropGeometry = new MeshSimple();
                    cropGeometry.Set(transformedMesh);
                    Object.DestroyImmediate(transformedMesh);

                    wr.meshCropGeometry_ = cropGeometry;
                }
            }

            wr.cropMode_ = (CROP_MODE)Data.CropMode;
            wr.weldAllRemainingsTogether_    = Data.WeldInOnePiece;
            wr.includeBoundary_              = Data.FrontierPieces;
            wr.isAbleToClassifyDisconnected_ = true;

            return(wr);
        }
Ejemplo n.º 5
0
        public static void TransformListMesh(List <GameObject> listParentGO, List <UnityEngine.Mesh> listMesh_un, Matrix4x4 m_BoundsWorld_to_BoundsLocal, out List <CaronteSharp.MeshComplex> listMesh_car)
        {
            listMesh_car = new List <CaronteSharp.MeshComplex>();
            int numParentGameObjects = listParentGO.Count;

            for (int i = 0; i < numParentGameObjects; ++i)
            {
                UnityEngine.Mesh un_mesh   = listMesh_un[i];
                GameObject       parent_go = listParentGO[i];

                Matrix4x4 m_Local_to_World  = parent_go.transform.localToWorldMatrix;
                Matrix4x4 m_Local_to_Bounds = m_BoundsWorld_to_BoundsLocal * m_Local_to_World;

                UnityEngine.Mesh transformedMesh;
                CRGeometryUtils.CreateMeshTransformed(un_mesh, m_Local_to_Bounds, out transformedMesh);

                CaronteSharp.MeshComplex car_mesh = new CaronteSharp.MeshComplex();
                car_mesh.Set(transformedMesh);

                UnityEngine.Object.DestroyImmediate(transformedMesh);
                listMesh_car.Add(car_mesh);
            }
        }
        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;

            CRGeometryUtils.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;
                    CRGeometryUtils.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();
        }