internal void Reconstruct(lightmap_vertex_buffer_bucket_block buffer_bucket, geometry_block_resource_block gb, IO.EndianReader er, Render.VertexBufferInterface.StreamReader[] stream_readers) { short stream_source = gb.SecondaryLocater.Value; var stream_r = stream_readers[stream_source]; if (!stream_r.UsesNullDefinition) { stream_r.Read(er); stream_r.Denormalize(); ReconstructRawVertex(buffer_bucket, stream_source, stream_r); } }
void ReconstructRawVertex(lightmap_vertex_buffer_bucket_block buffer_bucket, int stream_source, Render.VertexBufferInterface.StreamReader stream_reader) { LowLevel.Math.real_quaternion quat = new LowLevel.Math.real_quaternion(); // The following LM vertex sources only have one element, so we can call this here stream_reader.GetStreamedElement(0, ref quat); if (buffer_bucket.Flags.Test(k_bucket_flags_IncDir) && stream_source == 0) { PrimaryLightmapIncidentDirection.I = quat.Vector.I; PrimaryLightmapIncidentDirection.J = quat.Vector.J; PrimaryLightmapIncidentDirection.K = quat.Vector.K; } else if (buffer_bucket.Flags.Test(k_bucket_flags_Color) && stream_source == 1) { // alpha is quad.W, which LM color doesn't use PrimaryLightmapColor.R = quat.Vector.I; PrimaryLightmapColor.G = quat.Vector.J; PrimaryLightmapColor.B = quat.Vector.K; } }
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; }
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); }