public override void WriteMembers(SR1_Writer writer) { face.Write(writer); attr.Write(writer); sortPush.Write(writer); normal.Write(writer); if (IsInSignalGroup && attr.Value != 0) { Level level = (Level)writer.File._Structures[0]; Terrain terrain = (Terrain)writer.File._Structures[level.terrain.Offset]; SR1_StructureSeries <MultiSignal> signals = (SR1_StructureSeries <MultiSignal>)writer.File._Structures[level.SignalListStart.Offset]; MultiSignal terrainSignals = null; foreach (MultiSignal signal in signals) { if (signal.Start == terrain.signals.Offset) { terrainSignals = signal; break; } } // Looks like there are other things triggered besides portals/signals. // TODO - Figure out what, and correct here. if (MultiSignal != null) { textoff.Value = (ushort)(MultiSignal.NewStart - terrainSignals.NewStart); } } textoff.Write(writer); }
protected override void ReadReferences(SR1_Reader reader, SR1_Structure parent) { if (data.Offset != 0x00000000 && !reader.File._Structures.ContainsKey(data.Offset)) { reader.BaseStream.Position = (long)data.Offset; INICommand tempCMD = new INICommand(); do { tempCMD.ReadTemp(reader); }while (tempCMD.command.Value != 0); int bufferLength = (int)reader.BaseStream.Position - (int)data.Offset; SR1_StructureSeries <INICommand> commands = new SR1_StructureSeries <INICommand>(bufferLength); reader.BaseStream.Position = (long)data.Offset; commands.Read(reader, null, ""); if (reader.Level.Name == "push10") { new SR1_Primative <int>().Read(reader, null, ""); } } new MultiSpline().ReadFromPointer(reader, multiSpline); }
protected override void ReadReferences(SR1_Reader reader, SR1_Structure parent) { SR1_Structure temp = null; if (numVertices.Value > 0) { new SR1_StructureArray <TVertex>(numVertices.Value).ReadFromPointer(reader, vertexList); } SR1_StructureArray <TFace> faces = new SR1_StructureArray <TFace>(0); if (numFaces.Value > 0) { faces = new SR1_StructureArray <TFace>(numFaces.Value); faces.ReadFromPointer(reader, faceList); } if (numNormals.Value > 0) { temp = new SR1_StructureArray <Normal>(numNormals.Value).SetPadding(4).ReadFromPointer(reader, normalList); // 2 mystery bytes after normalList. Always 0x2A and 0xCD. if (temp.End != 0x00000000 && !reader.File._Structures.ContainsKey(temp.End)) { reader.BaseStream.Position = temp.End; new SR1_Primative <ushort>().Read(reader, null, ""); if (numFaces.Value <= 0) { new SR1_Primative <ushort>().Read(reader, null, ""); } } } new DrMoveAniTex().ReadFromPointer(reader, aniList); if (reader.File._Version <= SR1_File.Version.May12) { if (sbspRoot.Offset != 0 && sbspRoot.Offset < sbspStartLeaves.Offset) { new SR1_StructureSeries <BSPNode>((int)(sbspStartLeaves.Offset - sbspRoot.Offset)).ReadFromPointer(reader, sbspRoot); } } StreamUnitPortalList portalList = new StreamUnitPortalList(); portalList.ReadFromPointer(reader, StreamUnits); SR1_StructureSeries <TextureFT3> textures = new SR1_StructureSeries <TextureFT3>((int)(EndTextureList.Offset - StartTextureList.Offset)); textures.ReadFromPointer(reader, StartTextureList); if (reader.File._Version <= SR1_File.Version.May12) { new SR1_StructureSeries <SBSPLeaf>((int)(sbspEndLeaves.Offset - sbspStartLeaves.Offset)).ReadFromPointer(reader, sbspStartLeaves); if (reader.IntroListDictionary.Count > 0) { SR1_StructureList <SR1_PointerArray <Intro> > introListSet = new SR1_StructureList <SR1_PointerArray <Intro> >(); foreach (KeyValuePair <uint, SR1_PointerArray <Intro> > introList in reader.IntroListDictionary) { introListSet.Add(introList.Value); } introListSet.ReadFromPointer(reader, sbspEndLeaves); } } new SR1_StructureSeries <MorphVertex>((int)(MorphColorList.Offset - MorphDiffList.Offset)).ReadFromPointer(reader, MorphDiffList); int morphColorPadding = (reader.File._Version >= SR1_File.Version.May12) ? 4 : 2; new SR1_StructureArray <MorphColor>(numVertices.Value).SetPadding(morphColorPadding).ReadFromPointer(reader, MorphColorList); SR1_StructureArray <BSPTree> bspTrees = new SR1_StructureArray <BSPTree>(numBSPTrees.Value); bspTrees.ReadFromPointer(reader, BSPTreeArray); if (bspTrees.Count > 0 && faces.Count > 0) { BSPTree tree = (BSPTree)bspTrees[numBSPTrees.Value - 1]; if (tree.ID.Value == -1 && tree.startLeaves.Offset != 0 && reader.File._Structures.ContainsKey(tree.startLeaves.Offset) && reader.Level.SignalListStart.Offset != 0 && reader.File._Structures.ContainsKey(reader.Level.SignalListStart.Offset)) { SR1_StructureSeries <BSPLeaf> leaves = (SR1_StructureSeries <BSPLeaf>)reader.File._Structures[tree.startLeaves.Offset]; SR1_StructureSeries <MultiSignal> multiSignals = (SR1_StructureSeries <MultiSignal>)reader.File._Structures[reader.Level.SignalListStart.Offset]; foreach (BSPLeaf leaf in leaves) { uint faceIndex = (leaf.faceList.Offset - faces.Start) / 12; short numFaces = leaf.numFaces.Value; for (short f = 0; f < numFaces; f++) { TFace tFace = (TFace)faces[(int)faceIndex + f]; tFace.IsInSignalGroup = true; foreach (MultiSignal mSignal in multiSignals) { if (mSignal.Start == (signals.Offset + tFace.textoff.Value)) { tFace.MultiSignal = mSignal; if (mSignal.numSignals.Value > 0) { tFace.Signal = (Signal)mSignal.signalList[0]; } break; } } if (tFace.MultiSignal != null) { foreach (StreamUnitPortal portal in portalList.portals) { if (portal.MSignalID.Value == tFace.MultiSignal.signalNum.Value) { tFace.Portal = portal; break; } } } } } } } foreach (TFace face in faces) { if (!face.IsInSignalGroup) { int textureSize = (reader.File._Version >= SR1_File.Version.May12) ? 12 : 16; int textureIndex = face.textoff.Value / textureSize; if (textureIndex < textures.Count) { face.Texture = (TextureFT3)textures[textureIndex]; } } } new SR1_PrimativeArray <ushort>(numFaces.Value).SetPadding(4).ReadFromPointer(reader, morphNormalIdx); if (reader.File._Version == SR1_File.Version.Retail_PC) { new UnknownPCList().ReadFromPointer(reader, unknownPCList); } if (reader.Level.Name == "cathy28") { reader.BaseStream.Position = BSPTreeArray.Offset - 1; bool found = false; while (true) { if (reader.File._Structures.ContainsKey((uint)reader.BaseStream.Position)) { SR1_Structure structure = reader.File._Structures[(uint)reader.BaseStream.Position]; if (structure.GetType() == typeof(SR1_StructureSeries <BSPNode>)) { found = true; } else if (structure.GetType() != typeof(SR1_StructureSeries <BSPLeaf>)) { break; } if (found) { reader.BaseStream.Position = structure.End; continue; } } if (found) { new SR1_StructureArray <BSPLeaf>(1).Read(reader, null, ""); break; } reader.BaseStream.Position--; } } }
public override void MigrateVersion(SR1_File file, SR1_File.Version targetVersion, SR1_File.MigrateFlags migrateFlags) { base.MigrateVersion(file, targetVersion, migrateFlags); if (file._Version <= SR1_File.Version.May12 && targetVersion >= SR1_File.Version.Retail_PC) { if (sbspRoot.Offset != 0) { file._Structures.Remove(sbspRoot.Offset); sbspRoot.Offset = 0; } if (sbspStartLeaves.Offset != 0) { file._Structures.Remove(sbspStartLeaves.Offset); sbspStartLeaves.Offset = 0; sbspEndLeaves.Offset = 0; } } if (file._Version < SR1_File.Version.Retail_PC && targetVersion >= SR1_File.Version.Retail_PC) { if (aniList.Offset != 0) { file._Structures.Remove(aniList.Offset); aniList.Offset = 0; EndTextureList.Offset = MorphDiffList.Offset; } SR1_Structure lastStructure = file._Structures.Values[file._Structures.Count - 1]; uint position = lastStructure.End; unknownPCList.Offset = position; UnknownPCList newUnknownPCList = new UnknownPCList(); file._Structures.Add(position, newUnknownPCList); file._MigrationStructures.Add(position, newUnknownPCList); } if ((migrateFlags & SR1_File.MigrateFlags.ForceWaterTranslucent) != 0) { if (numFaces.Value > 0 && faceList.Offset != 0 && file._Structures.ContainsKey(faceList.Offset) && StartTextureList.Offset != 0 && file._Structures.ContainsKey(StartTextureList.Offset)) { SR1_Structure facesStruct = file._Structures[faceList.Offset]; SR1_Structure texturesStruct = file._Structures[StartTextureList.Offset]; if (facesStruct.GetType() == typeof(SR1_StructureArray <TFace>) && texturesStruct.GetType() == typeof(SR1_StructureSeries <TextureFT3>)) { SR1_StructureArray <TFace> faces = (SR1_StructureArray <TFace>)facesStruct; SR1_StructureSeries <TextureFT3> textures = (SR1_StructureSeries <TextureFT3>)texturesStruct; foreach (TFace face in faces) { if (!face.IsInSignalGroup && (face.attr.Value & 0x08) != 0) { int textureSize = file._Version < SR1_File.Version.May12 ? 16 : 12; TextureFT3 texture = (TextureFT3)textures[face.textoff.Value / textureSize]; texture.attr.Value |= 0x0010; } } } } } }