Esempio n. 1
0
 public BzMeshDataEditor(BzMeshData meshData, Plane planeLocal, IBzSliceAddapter adapter)
 {
     _meshData          = meshData;
     _adapter           = adapter;
     _planeLocal        = planeLocal;
     _chashedOuterLines = new Dictionary <IndexVector, int>();
 }
Esempio n. 2
0
        /// <summary>
        /// Start slicing process
        /// </summary>
        /// <param name="addData">You can pass any object. You will </param>
        /// <returns>Returns true if pre-slice conditions was succeeded and task was added to the queue</returns>
        private void StartSlice(BzSliceTryData sliceTryData, Action <BzSliceTryResult> callBack)
        {
            Renderer[]     renderers = GetRenderers(gameObject);
            SliceTryItem[] items     = new SliceTryItem[renderers.Length];

            for (int i = 0; i < renderers.Length; i++)
            {
                var renderer = renderers[i];

                var adapterAndMesh = GetAdapterAndMesh(renderer);

                if (adapterAndMesh == null)
                {
                    continue;
                }

                Mesh             mesh    = adapterAndMesh.mesh;
                IBzSliceAddapter adapter = adapterAndMesh.adapter;

                var configuration = renderer.gameObject.GetComponent <BzSliceConfiguration>();
                var meshDissector = new BzMeshDataDissector(mesh, sliceTryData.plane, renderer.sharedMaterials, adapter, configuration);
                meshDissector.DefaultSliceMaterial = _defaultSliceMaterial;

                SliceTryItem sliceTryItem = new SliceTryItem();
                sliceTryItem.meshRenderer  = renderer;
                sliceTryItem.meshDissector = meshDissector;
                items[i] = sliceTryItem;
            }

            SliceTry sliceTry = new SliceTry();

            sliceTry.items     = items;
            sliceTry.callBack  = callBack;
            sliceTry.sliceData = sliceTryData;

            if (Asynchronously)
            {
                StartWorker(WorkForWorker, sliceTry);
                _sliceTrys.Enqueue(sliceTry);
            }
            else
            {
                Work(sliceTry);
                SliceTryFinished(sliceTry);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Transfom vertices from modal space to plane space and convert them to Vector2[]
        /// </summary>
        private Vector2[] ConvertV3ToV2(IBzSliceAddapter adapter, Vector3 normal)
        {
            var rotation = Quaternion.FromToRotation(normal, Vector3.forward);
            var v2s      = new Vector2[_edgeLoop.size];


            var edge = _edgeLoop.first;

            for (int i = 0; i < _edgeLoop.size; i++)
            {
                Vector3 v3 = rotation * adapter.GetWorldPos(_meshData, edge.value);
                v2s[i] = v3;

                edge = edge.next;
            }

            return(v2s);
        }
Esempio n. 4
0
        public BzMeshDataDissector(Mesh mesh, Plane plane, Material[] materials, IBzSliceAddapter adapter, BzSliceConfiguration configuration)
        {
            _adapter      = adapter;
            _plane        = plane;
            Configuration = configuration;

            if (Configuration != null && Configuration.SliceMaterial == null)
            {
                Configuration.SliceMaterial = null;
            }

            _meshDataNeg = new BzMeshData(mesh, materials);
            _meshDataPos = new BzMeshData(mesh, materials);

            _subMeshes = new int[mesh.subMeshCount][];
            for (int subMeshIndex = 0; subMeshIndex < mesh.subMeshCount; ++subMeshIndex)
            {
                _subMeshes[subMeshIndex] = mesh.GetTriangles(subMeshIndex);
            }
        }
Esempio n. 5
0
        /// <param name="vertices">Chain of vertices for polygon</param>
        /// <param name="normal">Normal the polygon is facing to</param>
        public BzPoly(BzMeshData meshData, LinkedLoop <int> edgeLoop, Vector3 normal, IBzSliceAddapter adapter)
        {
            _meshData = meshData;
            _edgeLoop = edgeLoop;

            if (edgeLoop.size < 3)
            {
                return;
            }

            _polyVertices2D = ConvertV3ToV2(adapter, normal);


            var newTriangles1 = MakeMesh(false);
            var newTriangles2 = MakeMesh(true);

            // get triangle list with more vertices
            if (newTriangles1.Count > newTriangles2.Count)
            {
                _newTriangles = newTriangles1;
            }
            else
            {
                _newTriangles = newTriangles2;
            }

            if (_newTriangles.Count != 0)
            {
                Created = true;
            }
        }