示例#1
0
        private static void SaveSliceData(string filePath, SliceTry sliceTry)
        {
            IBzSliceAdapter[] adapters = new IBzSliceAdapter[sliceTry.items.Length];

            using (XmlWriter writer = XmlWriter.Create(filePath, new XmlWriterSettings {
                Encoding = Encoding.UTF8
            }))
            {
                writer.WriteStartDocument();
                writer.WriteStartElement("root");

                SerializeObject("position", sliceTry.position, writer);
                SerializeObject("rotation", sliceTry.position, writer);
                SerializeObject("plane", sliceTry.sliceData.plane, writer);

                writer.WriteStartElement("adapters");
                for (int i = 0; i < sliceTry.items.Length; i++)
                {
                    // save adapter
                    var adapter = sliceTry.items[i].meshDissector.Adapter;
                    adapters[i] = adapter;

                    writer.WriteStartElement(_adapterElementName);
                    writer.WriteElementString("adapterType", adapter.GetType().AssemblyQualifiedName);
                    SerializeObject("adapterData", adapter, writer);
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();                 // end "adapters" element
                writer.WriteEndDocument();
            }
        }
示例#2
0
 public BzMeshDataEditor(BzMeshData meshData, Plane planeLocal, IBzSliceAdapter adapter)
 {
     _meshData          = meshData;
     _adapter           = adapter;
     _planeLocal        = planeLocal;
     _chashedOuterLines = new Dictionary <IndexVector, int>();
 }
        /// <summary>
        /// Transfom vertices from modal space to plane space and convert them to Vector2[]
        /// </summary>
        private Vector2[] ConvertV3ToV2(IBzSliceAdapter adapter, Vector3 normal)
        {
            normal = adapter.InverseTransformDirection(normal);

            Quaternion rotation;

            if (Vector3.Dot(normal, Vector3.back) < 0f)
            {
                // required to have deterministic texture rotation
                rotation = Quaternion.Euler(180f, 0f, 0f) * Quaternion.FromToRotation(-normal, Vector3.back);
            }
            else
            {
                rotation = Quaternion.FromToRotation(normal, Vector3.back);
            }

            var v2s = new Vector2[edgeLoop.size];

            var edge = edgeLoop.first;

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

                edge = edge.next;
            }

            return(v2s);
        }
示例#4
0
 public BzMeshDataEditor(BzMeshData meshData, Plane plane, IBzSliceAdapter adapter, bool skipIfNotClosed)
 {
     _meshData          = meshData;
     _adapter           = adapter;
     _skipIfNotClosed   = skipIfNotClosed;
     _plane             = plane;
     _chashedOuterLines = new Dictionary <IndexVector, int>();
 }
示例#5
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, IBzSliceAdapter[] adapters, 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;
                IBzSliceAdapter adapter = adapters == null ? adapterAndMesh.adapter : adapters[i];

                var configuration = renderer.gameObject.GetComponent <BzSliceConfiguration>();
                var confDto       = configuration == null?BzSliceConfiguration.GetDefault() : configuration.GetDto();

                var meshDissector = new BzMeshDataDissector(mesh, sliceTryData.plane, renderer.sharedMaterials, adapter, confDto);
                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;
            sliceTry.position  = transform.position;
            sliceTry.rotation  = transform.rotation;

            if (asynchronously)
            {
                StartWorker(WorkForWorker, sliceTry);
                _sliceTrys.Enqueue(sliceTry);
            }
            else
            {
                Work(sliceTry);
                SliceTryFinished(sliceTry);
            }
        }
示例#6
0
        public BzMeshDataDissector(Mesh mesh, Plane plane, Material[] materials, IBzSliceAdapter adapter, SliceConfigurationDto configuration)
        {
            _adapter      = adapter;
            _plane        = plane;
            Configuration = configuration;

            _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);
            }
        }
示例#7
0
        private static void ReadAdapter(List <IBzSliceAdapter> adapters, XmlReader reader)
        {
            using (var r = reader.ReadSubtree())
            {
                string          adapterTypeStr = null;
                IBzSliceAdapter adapter        = null;
                while (!r.EOF)
                {
                    if (r.NodeType != XmlNodeType.Element)
                    {
                        r.Read();
                        continue;
                    }

                    switch (r.Name)
                    {
                    case "adapterType":
                        adapterTypeStr = r.ReadElementContentAsString();
                        break;

                    case "adapterData":
                        if (adapterTypeStr == null)
                        {
                            throw new InvalidOperationException("adapterType should be declared first");
                        }
                        Type adapterType = Type.GetType(adapterTypeStr);


                        using (var rr = reader.ReadSubtree())
                        {
                            object o = new XmlSerializer(adapterType, new XmlRootAttribute(r.Name)).Deserialize(rr);
                            adapter = (IBzSliceAdapter)o;
                        }
                        break;

                    default:
                        r.Read();
                        break;
                    }
                }

                if (adapter == null)
                {
                    throw new InvalidOperationException("adapterData element not found");
                }
                adapters.Add(adapter);
            }
        }
示例#8
0
        /// <summary>
        /// Transfom vertices from modal space to plane space and convert them to Vector2[]
        /// </summary>
        private Vector2[] ConvertV3ToV2(IBzSliceAdapter adapter, Vector3 normal)
        {
            var rotation = Quaternion.FromToRotation(normal, Vector3.back);
            var v2s      = new Vector2[edgeLoop.size];


            var edge = edgeLoop.first;

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

                edge = edge.next;
            }

            return(v2s);
        }
示例#9
0
        /// <param name="vertices">Chain of vertices for polygon</param>
        /// <param name="normal">Normal the polygon is facing to</param>
        public BzPolyLoop(BzMeshData meshData, LinkedLoop <int> edgeLoop, Vector3 normal, IBzSliceAdapter adapter)
        {
            this.meshData = meshData;
            this.edgeLoop = edgeLoop;

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

            Profiler.BeginSample("ConvertV3ToV2");
            polyVertices2D = ConvertV3ToV2(adapter, normal);
            Profiler.EndSample();

            Profiler.BeginSample("MakeMesh");
            var newTriangles1 = MakeMesh(true);
            var newTriangles2 = MakeMesh(false);

            Profiler.EndSample();

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

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