예제 #1
0
파일: GeoModel.cs 프로젝트: bblpny/Quad64
        internal void AddVertex(Scripts.TempMesh mesh_non_node, ref Vertex128 vertex)
        {
            if (!Building)
            {
                return;
            }

            TempMesh128 iter;
            uint        iter_pos;
            var         equator = Scripts.TempMesh.Equator;

            // note that this starts at last on purpose. the nodes are a ring.
            for (iter = TempMeshes.last, iter_pos = TempMeshes.count; 0 != iter_pos; iter = iter.next, --iter_pos)
            {
                if (iter.hashCode == mesh_non_node.hashCode &&
                    equator.Equals(ref iter.value, ref mesh_non_node.value))
                {
                    break;
                }
            }

            if (0 == iter_pos)
            {
                // need a new mesh.
                var references = new TempMesh128References
                {
                    bmp = mesh_non_node.references.bmp,
                };
                TempMesh128.Add(ref TempMeshes, ref mesh_non_node.value, ref references);
                iter = TempMeshes.last;
            }
            else if (iter_pos != TempMeshes.count)
            {
                // spin it around a bit to optimize following vertices.
                TempMeshes.first = iter.next;
                TempMeshes.last  = iter;
            }
            TempVertex128.Add(ref iter.references.list, ref vertex);
        }
예제 #2
0
파일: GeoModel.cs 프로젝트: bblpny/Quad64
        internal Dictionary <TempVertex128, TempVertex128> Build(Dictionary <TempVertex128, TempVertex128> temp = null)
        {
            if (this.Building)
            {
                this.Building = false;
                var List = this.TempMeshes;
                this.TempMeshes = default(TempMesh128.List);
                try
                {
                    var Iter = List.first;
                    var Pos  = List.count;
                    while (0 != Pos--)
                    {
                        var New = new GeoMesh(this, Iter, ref temp);
                        Iter = Iter.next;

                        if (0 == Count++)
                        {
                            New.Next = New;
                            First    = New;
                        }
                        else
                        {
                            Last.Next = New;
                            New.Next  = First;
                        }
                        Last           = New;
                        DrawLayerMask |= (byte)(1 << (New.Material.drawLayerBillboard & 7));
                    }
                }
                finally
                {
                    TempMesh128.Free(ref List);
                }
            }
            return(temp);
        }