public BzMeshDataEditor(BzMeshData meshData, Plane planeLocal, IBzSliceAddapter adapter) { _meshData = meshData; _adapter = adapter; _planeLocal = planeLocal; _chashedOuterLines = new Dictionary <IndexVector, int>(); }
/// <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); } }
/// <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); }
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); } }
/// <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; } }