public void Load() { Disposed = false; Magic = Encoding.ASCII.GetString(ParentDVLB.Data, (int)Offset + 0x00, 4); if (Magic != DVLEMagic) { throw new Exception(string.Format("Trying to read data with tag '{0}' as {1}, expected tag '{2}'", Magic, this.GetType().Name, DVLEMagic)); } ShaderType = (ShaderTypes)ParentDVLB.Data[Offset + 0x06]; ProgramMainOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x08); ProgramEndMainOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x0C); Unknown0x10 = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x10); Unknown0x14 = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x14); UniformTableOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x18); NumberOfUniformEntries = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x1C); LabelTableOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x20); NumberOfLabelEntries = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x24); UnknownTableOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x28); NumberOfUnknownEntries = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x2C); VariableTableOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x30); NumberOfVariableEntries = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x34); SymbolTableOffset = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x38); SizeOfSymbolTable = BitConverter.ToUInt32(ParentDVLB.Data, (int)Offset + 0x3C); UniformTable = new UniformTableEntry[NumberOfUniformEntries]; for (int i = 0; i < UniformTable.Length; i++) { UniformTable[i] = new UniformTableEntry(this, (int)UniformTableOffset + (i * UniformTableEntry.Size)); } LabelTable = new LabelTableEntry[NumberOfLabelEntries]; for (int i = 0; i < LabelTable.Length; i++) { LabelTable[i] = new LabelTableEntry(this, (int)LabelTableOffset + (i * LabelTableEntry.Size)); } //unknown table VariableTable = new VariableTableEntry[NumberOfVariableEntries]; for (int i = 0; i < VariableTable.Length; i++) { VariableTable[i] = new VariableTableEntry(this, (int)VariableTableOffset + (i * VariableTableEntry.Size)); } }
private void DecompileLabelTable() { PopByte(); var name = ReadNameRef(); var ofs = ReadUInt32(); while (ofs != 0x0000FFFF) // ends with non-ref + max-offset { var entry = new LabelTableEntry(); entry.NameRef = name; entry.Name = PCC.GetName(name); entry.Offset = ofs; LabelTable.Add(entry); name = ReadNameRef(); ofs = ReadUInt32(); } }