Example #1
0
        internal bool Reconstruct(geometry_block_info_struct gbi)
        {
            int index = 0;

            byte[][] data = gbi.GeometryBlock;

            if (data == null)
            {
                return(false);
            }

            foreach (geometry_block_resource_block gb in gbi.Resources)
            {
                using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                {
                    switch (gb.Type.Value)
                    {
                        #region TagBlock
                    case (int)geometry_block_resource_type.TagBlock:
                        int count = gb.GetCount();
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetPlacements:
                            Placements.Resize(count);
                            Placements.Read(er);
                            break;

                        case OffsetDecalVertices:
                            DecalVertices.Resize(count);
                            DecalVertices.Read(er);
                            break;

                        case OffsetDecalIndices:
                            DecalIndices.Resize(count);
                            DecalIndices.Read(er);
                            break;

                        case OffsetSpriteVertices:
                            SpriteVertices.Resize(count);
                            SpriteVertices.Read(er);
                            break;

                        case OffsetSpriteIndices:
                            SpriteIndices.Resize(count);
                            SpriteIndices.Read(er);
                            break;
                        }
                        break;
                        #endregion
                    }
                }

                index++;
            }

            return(true);
        }
Example #2
0
		internal bool Reconstruct(geometry_block_info_struct gbi)
		{
			int index = 0;
			byte[][] data = gbi.GeometryBlock;

			if (data == null) return false;

			foreach (geometry_block_resource_block gb in gbi.Resources)
			{
				using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
				{
					switch (gb.Type.Value)
					{
						#region TagBlock
						case (int)geometry_block_resource_type.TagBlock:
							int count = gb.GetCount();
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetPlacements:
									Placements.Resize(count);
									Placements.Read(er);
									break;

								case OffsetDecalVertices:
									DecalVertices.Resize(count);
									DecalVertices.Read(er);
									break;

								case OffsetDecalIndices:
									DecalIndices.Resize(count);
									DecalIndices.Read(er);
									break;

								case OffsetSpriteVertices:
									SpriteVertices.Resize(count);
									SpriteVertices.Read(er);
									break;

								case OffsetSpriteIndices:
									SpriteIndices.Resize(count);
									SpriteIndices.Read(er);
									break;
							}
							break;
						#endregion
					}
				}

				index++;
			}

			return true;
		}
        internal bool Reconstruct(geometry_block_info_struct gbi)
        {
            int index = 0;

            byte[][] data = gbi.GeometryBlock;

            if (data == null)
            {
                return(false);
            }

            foreach (geometry_block_resource_block gb in gbi.Resources)
            {
                using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                {
                    switch (gb.Type.Value)
                    {
                        #region TagBlock
                    case (int)geometry_block_resource_type.TagBlock:
                        int count = gb.GetCount();
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetSoundDialogueInfo:
                            SoundDialogueInfo.Resize(count);
                            SoundDialogueInfo.Read(er);
                            break;
                        }
                        break;

                        #endregion
                        #region TagData
                    case (int)geometry_block_resource_type.TagData:
                        if (gb.PrimaryLocater.Value == OffsetEncodedData)
                        {
                            EncodedData.Reset(er.ReadBytes(gb.Size));
                        }
                        break;
                        #endregion
                    }
                }

                index++;
            }

            return(true);
        }
Example #4
0
            internal bool Reconstruct(Blam.CacheFile c,
                                      global_geometry_section_info_struct section,
                                      geometry_block_info_struct gbi)
            {
                Section.Value.Reconstruct(c, section, gbi);
                PointData.Value.Reconstruct(c, section, gbi);

                int index = 0;

                byte[][] data = gbi.GeometryBlock;

                if (data == null)
                {
                    return(false);
                }

                foreach (geometry_block_resource_block gb in gbi.Resources)
                {
                    using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                    {
                        switch (gb.Type.Value)
                        {
                            #region TagBlock
                        case (int)geometry_block_resource_type.TagBlock:
                            int count = gb.GetCount();
                            switch (gb.PrimaryLocater.Value)
                            {
                            case OffsetNodeMap:
                                NodeMap.Resize(count);
                                NodeMap.Read(er);
                                break;
                            }
                            break;
                            #endregion
                        }

                        index++;
                    }
                }

                return(true);
            }
Example #5
0
        bool ReadVertexBufferHack(Blam.CacheFile c,
                                  geometry_block_info_struct gbi)
        {
            var rsrc_cache = Program.Halo2.FromLocation(c as Halo2.CacheFile, gbi.GetBlockOffset());

            // the shared cache isn't loaded, break
            if (rsrc_cache == null)
            {
                return(false);
            }

            // seek to the actual data
            var er = rsrc_cache.InputStream;

            er.Seek(gbi.GetBlockOffset().Offset + 8);

            VertexBuffers.Add();
            VertexBuffers.Read(er);

            return(true);
        }
Example #6
0
        bool ReconstructRawPcaData(Blam.CacheFile c,
                                   geometry_block_info_struct gbi)
        {
            int index = 0;
            int x;

            byte[][] data = gbi.GeometryBlock;

            if (data == null)
            {
                return(false);
            }

            foreach (geometry_block_resource_block gb in gbi.Resources)
            {
                using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                {
                    switch (gb.Type.Value)
                    {
                        #region TagBlock
                    case (int)geometry_block_resource_type.TagBlock:
                        int count = gb.GetCount();
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetVertexBuffers:
                            VertexBuffers.Resize(count);
                            VertexBuffers.Read(er);
                            break;
                        }
                        break;

                        #endregion
                        #region VertexBuffer
                    case (int)geometry_block_resource_type.VertexBuffer:
                        var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

                        // HACK: Figure out why we PRT stores the vertex buffer in the geometry block info's
                        // "section data" and not in a tag block resource
                        if (VertexBuffers.Count == 0 && !ReadVertexBufferHack(c, gbi))
                        {
                            break;
                        }

                        var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
                        for (x = 0; x < VertexBuffers.Count; x++)
                        {
                            VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);
                        }

                        int vertex_count = gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;
                        if (RawPcaData.Count == 0)
                        {
                            RawPcaData.Resize(vertex_count * 5);                                     // 5x as there are 5 fields in the Pca data
                        }
                        for (x = 0; x < vertex_count; x++)
                        {
                            ReconstructRawPcaData(x, gb, er, stream_readers);
                        }
                        break;
                        #endregion
                    }
                }
                index++;
            }

            VertexBuffers.DeleteAll();

            return(true);
        }
Example #7
0
				internal bool Reconstruct(Blam.CacheFile c,
					lightmap_vertex_buffer_bucket_block buffer_bucket,
					geometry_block_info_struct gbi)
				{
					int index = 0;
					int x;
					byte[][] data = gbi.GeometryBlock;

					if (data == null) return false;

					foreach (geometry_block_resource_block gb in gbi.Resources)
					{
						using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
						{
							switch (gb.Type.Value)
							{
								#region TagBlock
								case (int)geometry_block_resource_type.TagBlock:
									int count = gb.GetCount();
									switch (gb.PrimaryLocater.Value)
									{
										case OffsetVertexBuffers:
											VertexBuffers.Resize(count);
											VertexBuffers.Read(er);
											break;
									}
									break;
								#endregion
								#region VertexBuffer
								case (int)geometry_block_resource_type.VertexBuffer:
									var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

									var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
									for (x = 0; x < VertexBuffers.Count; x++)
										VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);

									int vertex_count = gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;
									if(buffer_bucket.RawVertices.Count == 0)
										buffer_bucket.RawVertices.Resize(vertex_count);
									for (x = 0; x < vertex_count; x++)
										buffer_bucket.RawVertices[x].Reconstruct(buffer_bucket, gb,
											er, stream_readers);
									break;
								#endregion
							}
						}

						index++;
					}

					VertexBuffers.DeleteAll();

					return true;
				}
Example #8
0
				internal bool Reconstruct(Blam.CacheFile c,
					global_geometry_section_info_struct section_info,
					geometry_block_info_struct gbi)
				{
					return Geometry.Value.Reconstruct(c, section_info, gbi);
				}
Example #9
0
		bool ReconstructRawPcaData(Blam.CacheFile c,
			geometry_block_info_struct gbi)
		{
			int index = 0;
			int x;
			byte[][] data = gbi.GeometryBlock;

			if (data == null) return false;

			foreach (geometry_block_resource_block gb in gbi.Resources)
			{
				using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
				{
					switch (gb.Type.Value)
					{
						#region TagBlock
						case (int)geometry_block_resource_type.TagBlock:
							int count = gb.GetCount();
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetVertexBuffers:
									VertexBuffers.Resize(count);
									VertexBuffers.Read(er);
									break;
							}
							break;
						#endregion
						#region VertexBuffer
						case (int)geometry_block_resource_type.VertexBuffer:
							var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

							// HACK: Figure out why we PRT stores the vertex buffer in the geometry block info's
							// "section data" and not in a tag block resource
							if (VertexBuffers.Count == 0 && !ReadVertexBufferHack(c, gbi))
								break;

							var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
							for (x = 0; x < VertexBuffers.Count; x++)
								VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);

							int vertex_count = gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;
							if (RawPcaData.Count == 0)
								RawPcaData.Resize(vertex_count * 5); // 5x as there are 5 fields in the Pca data

							for (x = 0; x < vertex_count; x++)
								ReconstructRawPcaData(x, gb, er, stream_readers);
							break;
						#endregion
					}
				}
				index++;
			}

			VertexBuffers.DeleteAll();

			return true;
		}
Example #10
0
                internal bool Reconstruct(Blam.CacheFile c,
                                          lightmap_vertex_buffer_bucket_block buffer_bucket,
                                          geometry_block_info_struct gbi)
                {
                    int index = 0;
                    int x;

                    byte[][] data = gbi.GeometryBlock;

                    if (data == null)
                    {
                        return(false);
                    }

                    foreach (geometry_block_resource_block gb in gbi.Resources)
                    {
                        using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                        {
                            switch (gb.Type.Value)
                            {
                                #region TagBlock
                            case (int)geometry_block_resource_type.TagBlock:
                                int count = gb.GetCount();
                                switch (gb.PrimaryLocater.Value)
                                {
                                case OffsetVertexBuffers:
                                    VertexBuffers.Resize(count);
                                    VertexBuffers.Read(er);
                                    break;
                                }
                                break;

                                #endregion
                                #region VertexBuffer
                            case (int)geometry_block_resource_type.VertexBuffer:
                                var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

                                var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
                                for (x = 0; x < VertexBuffers.Count; x++)
                                {
                                    VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);
                                }

                                int vertex_count = gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;
                                if (buffer_bucket.RawVertices.Count == 0)
                                {
                                    buffer_bucket.RawVertices.Resize(vertex_count);
                                }
                                for (x = 0; x < vertex_count; x++)
                                {
                                    buffer_bucket.RawVertices[x].Reconstruct(buffer_bucket, gb,
                                                                             er, stream_readers);
                                }
                                break;
                                #endregion
                            }
                        }

                        index++;
                    }

                    VertexBuffers.DeleteAll();

                    return(true);
                }
Example #11
0
 internal bool Reconstruct(Blam.CacheFile c,
                           global_geometry_section_info_struct section_info,
                           geometry_block_info_struct gbi)
 {
     return(Geometry.Value.Reconstruct(c, section_info, gbi));
 }
Example #12
0
		internal bool Reconstruct(geometry_block_info_struct gbi)
		{
			int index = 0;
			byte[][] data = gbi.GeometryBlock;

			if (data == null) return false;

			foreach (geometry_block_resource_block gb in gbi.Resources)
			{
				using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
				{
					switch (gb.Type.Value)
					{
						#region TagBlock
						case (int)geometry_block_resource_type.TagBlock:
							int count = gb.GetCount();
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetSoundDialogueInfo:
									SoundDialogueInfo.Resize(count);
									SoundDialogueInfo.Read(er);
									break;
							}
							break;
						#endregion
						#region TagData
						case (int)geometry_block_resource_type.TagData:
							if (gb.PrimaryLocater.Value == OffsetEncodedData)
								EncodedData.Reset(er.ReadBytes(gb.Size));
							break;
						#endregion
					}
				}

				index++;
			}

			return true;
		}
Example #13
0
			internal bool Reconstruct(Blam.CacheFile c,
				global_geometry_section_info_struct section,
				geometry_block_info_struct gbi)
			{
				Section.Value.Reconstruct(c, section, gbi);
				PointData.Value.Reconstruct(c, section, gbi);

				int index = 0;
				byte[][] data = gbi.GeometryBlock;

				if (data == null) return false;

				foreach (geometry_block_resource_block gb in gbi.Resources)
				{
					using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
					{
						switch (gb.Type.Value)
						{
							#region TagBlock
							case (int)geometry_block_resource_type.TagBlock:
								int count = gb.GetCount();
								switch (gb.PrimaryLocater.Value)
								{
									case OffsetNodeMap:
										NodeMap.Resize(count);
										NodeMap.Read(er);
										break;
								}
								break;
							#endregion
						}

						index++;
					}
				}

				return true;
			}
Example #14
0
		internal bool Reconstruct(
			BlamLib.Blam.CacheFile c,
			global_geometry_section_info_struct section,
			geometry_block_info_struct gbi
			)
		{
			int index = 0;
			byte[][] data = gbi.GeometryBlock;

			if (data == null) return false;

			foreach (geometry_block_resource_block gb in gbi.Resources)
			{
				using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
				{
					switch (gb.Type.Value)
					{
						#region TagBlock
						case (int)geometry_block_resource_type.TagBlock:
							int count = gb.GetCount();
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetRawPoints:
									RawPoints.Resize(count);
									RawPoints.Read(er);
									break;

								case OffsetRigidPointGroups:
									RigidPointGroups.Resize(count);
									RigidPointGroups.Read(er);
									break;

								case OffsetVertexPointIndices:
									VertexPointIndices.Resize(count);
									VertexPointIndices.Read(er);
									break;
							}
							break;
						#endregion
						#region TagData
						case (int)geometry_block_resource_type.TagData:
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetRuntimePointData:
									RuntimePointData.Reset(er.ReadBytes(gb.Size));
									break;
							}
							break;
						#endregion
						#region VertexBuffer
						//case (int)geometry_block_resource_type.VertexBuffer:
						#endregion
					}

					index++;
				}
			}

			return true;
		}
Example #15
0
		/// <summary></summary>
		/// <param name="c"></param>
		/// <param name="section_info">Can be null if tag data doesn't have it</param>
		/// <param name="gbi"></param>
		/// <returns></returns>
		internal bool Reconstruct(Blam.CacheFile c,
			global_geometry_section_info_struct section_info,
			geometry_block_info_struct gbi)
		{
			int index = 0;
			int x;
			byte[][] data = gbi.GeometryBlock;

			if (data == null) return false;

			foreach (geometry_block_resource_block gb in gbi.Resources)
			{
				using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
				{
					switch (gb.Type.Value)
					{
						#region TagBlock
						case (int)geometry_block_resource_type.TagBlock:
							int count = gb.GetCount();
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetParts:
									Parts.Resize(count);
									Parts.Read(er);
									break;

								case OffsetSubparts:
									Subparts.Resize(count);
									Subparts.Read(er);
									break;

								case OffsetVisibilityBounds:
									VisibilityBounds.Resize(count);
									VisibilityBounds.Read(er);
									break;

								case OffsetStripIndices:
									StripIndices.Resize(count);
									StripIndices.Read(er);
									break;

								case OffsetMoppReorderTable:
									MoppReorderTable.Resize(count);
									MoppReorderTable.Read(er);
									break;

								case OffsetVertexBuffers:
									VertexBuffers.Resize(count);
									VertexBuffers.Read(er);
									break;
							}
							break;
						#endregion
						#region TagData
						case (int)geometry_block_resource_type.TagData:
							switch (gb.PrimaryLocater.Value)
							{
								case OffsetVisibilityMoppCode:
									VisibilityMoppCode.Reset(er.ReadBytes(gb.Size));
									break;
							}
							break;
						#endregion
						#region VertexBuffer
						case (int)geometry_block_resource_type.VertexBuffer:
							var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

							var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
							for (x = 0; x < VertexBuffers.Count; x++)
								VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);

							if (RawVertices.Count == 0)
							{
								int vertex_count = section_info != null ?
									section_info.TotalVertexCount :
									gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;

								RawVertices.Resize(vertex_count);
							}

							for (x = 0; x < RawVertices.Count; x++)
								RawVertices[x].Reconstruct(section_info, gb, 
									er, stream_readers);
							break;
						#endregion
					}
				}

				index++;
			}

			VertexBuffers.DeleteAll();

			return true;
		}
Example #16
0
        /// <summary></summary>
        /// <param name="c"></param>
        /// <param name="section_info">Can be null if tag data doesn't have it</param>
        /// <param name="gbi"></param>
        /// <returns></returns>
        internal bool Reconstruct(Blam.CacheFile c,
                                  global_geometry_section_info_struct section_info,
                                  geometry_block_info_struct gbi)
        {
            int index = 0;
            int x;

            byte[][] data = gbi.GeometryBlock;

            if (data == null)
            {
                return(false);
            }

            foreach (geometry_block_resource_block gb in gbi.Resources)
            {
                using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                {
                    switch (gb.Type.Value)
                    {
                        #region TagBlock
                    case (int)geometry_block_resource_type.TagBlock:
                        int count = gb.GetCount();
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetParts:
                            Parts.Resize(count);
                            Parts.Read(er);
                            break;

                        case OffsetSubparts:
                            Subparts.Resize(count);
                            Subparts.Read(er);
                            break;

                        case OffsetVisibilityBounds:
                            VisibilityBounds.Resize(count);
                            VisibilityBounds.Read(er);
                            break;

                        case OffsetStripIndices:
                            StripIndices.Resize(count);
                            StripIndices.Read(er);
                            break;

                        case OffsetMoppReorderTable:
                            MoppReorderTable.Resize(count);
                            MoppReorderTable.Read(er);
                            break;

                        case OffsetVertexBuffers:
                            VertexBuffers.Resize(count);
                            VertexBuffers.Read(er);
                            break;
                        }
                        break;

                        #endregion
                        #region TagData
                    case (int)geometry_block_resource_type.TagData:
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetVisibilityMoppCode:
                            VisibilityMoppCode.Reset(er.ReadBytes(gb.Size));
                            break;
                        }
                        break;

                        #endregion
                        #region VertexBuffer
                    case (int)geometry_block_resource_type.VertexBuffer:
                        var vb_defs = (c.TagIndexManager as InternalCacheTagIndex).kVertexBuffers;

                        var stream_readers = new Render.VertexBufferInterface.StreamReader[VertexBuffers.Count];
                        for (x = 0; x < VertexBuffers.Count; x++)
                        {
                            VertexBuffers[x].VertexBuffer.InitializeStreamReader(vb_defs, out stream_readers[x]);
                        }

                        if (RawVertices.Count == 0)
                        {
                            int vertex_count = section_info != null ?
                                               section_info.TotalVertexCount :
                                               gb.Size.Value / VertexBuffers[0].VertexBuffer.StrideSize;

                            RawVertices.Resize(vertex_count);
                        }

                        for (x = 0; x < RawVertices.Count; x++)
                        {
                            RawVertices[x].Reconstruct(section_info, gb,
                                                       er, stream_readers);
                        }
                        break;
                        #endregion
                    }
                }

                index++;
            }

            VertexBuffers.DeleteAll();

            return(true);
        }
Example #17
0
        internal bool Reconstruct(
            BlamLib.Blam.CacheFile c,
            global_geometry_section_info_struct section,
            geometry_block_info_struct gbi
            )
        {
            int index = 0;

            byte[][] data = gbi.GeometryBlock;

            if (data == null)
            {
                return(false);
            }

            foreach (geometry_block_resource_block gb in gbi.Resources)
            {
                using (IO.EndianReader er = new BlamLib.IO.EndianReader(data[index]))
                {
                    switch (gb.Type.Value)
                    {
                        #region TagBlock
                    case (int)geometry_block_resource_type.TagBlock:
                        int count = gb.GetCount();
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetRawPoints:
                            RawPoints.Resize(count);
                            RawPoints.Read(er);
                            break;

                        case OffsetRigidPointGroups:
                            RigidPointGroups.Resize(count);
                            RigidPointGroups.Read(er);
                            break;

                        case OffsetVertexPointIndices:
                            VertexPointIndices.Resize(count);
                            VertexPointIndices.Read(er);
                            break;
                        }
                        break;

                        #endregion
                        #region TagData
                    case (int)geometry_block_resource_type.TagData:
                        switch (gb.PrimaryLocater.Value)
                        {
                        case OffsetRuntimePointData:
                            RuntimePointData.Reset(er.ReadBytes(gb.Size));
                            break;
                        }
                        break;
                        #endregion
                        #region VertexBuffer
                        //case (int)geometry_block_resource_type.VertexBuffer:
                        #endregion
                    }

                    index++;
                }
            }

            return(true);
        }
Example #18
0
		bool ReadVertexBufferHack(Blam.CacheFile c,
			geometry_block_info_struct gbi)
		{
			var rsrc_cache = Program.Halo2.FromLocation(c as Halo2.CacheFile, gbi.GetBlockOffset());

			// the shared cache isn't loaded, break
			if (rsrc_cache == null)
				return false;

			// seek to the actual data
			var er = rsrc_cache.InputStream;
			er.Seek(gbi.GetBlockOffset().Offset + 8);

			VertexBuffers.Add();
			VertexBuffers.Read(er);

			return true;
		}