コード例 #1
0
                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);
                    }
                }
コード例 #2
0
                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;
                    }
                }
コード例 #3
0
ファイル: Bsp.cs プロジェクト: CodeAsm/open-sauce
				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;
				}
コード例 #4
0
ファイル: Bsp.cs プロジェクト: CodeAsm/open-sauce
				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);
					}
				}
コード例 #5
0
ファイル: Bsp.cs プロジェクト: CodeAsm/open-sauce
				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;
					}
				}
コード例 #6
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);
                }