public static GameMaterial Read(Reader reader, Pointer offset) { MapLoader l = MapLoader.Loader; GameMaterial gm = new GameMaterial(offset); if (Settings.s.game == Settings.Game.R2Revolution) { gm.soundMaterial = reader.ReadUInt32(); gm.collideMaterial = CollideMaterial.Read(reader, Pointer.Current(reader)); // Maybe the first uint16 of collidematerial in Revolution is actually sound material, but eh } else { if (Settings.s.engineVersion < Settings.EngineVersion.R3) { gm.off_visualMaterial = Pointer.Read(reader); gm.off_mechanicsMaterial = Pointer.Read(reader); } gm.soundMaterial = reader.ReadUInt32(); gm.off_collideMaterial = Pointer.Read(reader, allowMinusOne: true); if (gm.off_visualMaterial != null) { gm.visualMaterial = VisualMaterial.FromOffsetOrRead(gm.off_visualMaterial, reader); } if (gm.off_collideMaterial != null) { gm.collideMaterial = CollideMaterial.FromOffsetOrRead(gm.off_collideMaterial, reader); } } return(gm); }
public void Read(Reader reader, bool inline = false) { if (inline) { ReadInternal(reader); Size = Pointer.Current(reader).offset - Offset.offset; } else { Pointer.DoAt(ref reader, Offset, () => { ReadInternal(reader); Size = Pointer.Current(reader).offset - Offset.offset; }); } }
public static Family Read(EndianBinaryReader reader, Pointer offset) { MapLoader l = MapLoader.Loader; Family f = new Family(offset); f.off_family_next = Pointer.Read(reader); f.off_family_prev = Pointer.Read(reader); f.off_family_unk = Pointer.Read(reader); // at this offset, start and end pointers appear again f.family_index = reader.ReadUInt32(); f.name = l.objectTypes[0][f.family_index].name; f.off_states_first = Pointer.Read(reader); if (l.mode != MapLoader.Mode.RaymanArenaGC) { f.off_states_last = Pointer.Read(reader); } f.num_states = reader.ReadUInt32(); if (l.mode != MapLoader.Mode.Rayman2PC) { f.off_preloadAnim_first = Pointer.Read(reader); // (0x10 blocks: next, prev, list end, a3d pointer) if (l.mode != MapLoader.Mode.RaymanArenaGC) { f.off_preloadAnim_last = Pointer.Read(reader); } f.num_preloadAnim = reader.ReadUInt32(); } f.off_physical_list_default = Pointer.Read(reader); // Default objects table f.off_physical_list_first = Pointer.Read(reader); // first physical list if (l.mode != MapLoader.Mode.RaymanArenaGC) { f.off_physical_list_last = Pointer.Read(reader); // last physical list } f.num_physical_lists = reader.ReadUInt32(); if (f.off_physical_list_first == f.off_physical_list_last && f.num_physical_lists > 1) { f.num_physical_lists = 1; // Correction for Rayman 2 } f.off_bounding_volume = Pointer.Read(reader); if (l.mode == MapLoader.Mode.Rayman3GC || l.mode == MapLoader.Mode.Rayman3PC) { f.off_vector4s = Pointer.Read(reader); f.num_vector4s = reader.ReadUInt32(); reader.ReadUInt32(); } if (l.mode == MapLoader.Mode.Rayman2PC) { reader.ReadUInt32(); f.animBank = reader.ReadByte(); reader.ReadByte(); reader.ReadByte(); reader.ReadByte(); f.properties = reader.ReadByte(); reader.ReadByte(); reader.ReadByte(); reader.ReadByte(); } else { reader.ReadUInt32(); reader.ReadByte(); reader.ReadByte(); f.animBank = reader.ReadByte(); f.properties = reader.ReadByte(); } f.states = new State[f.num_states]; if (f.num_states > 0) { Pointer off_states_current = f.off_states_first; for (int i = 0; i < f.num_states; i++) { Pointer.Goto(ref reader, off_states_current); f.states[i] = State.Read(reader, off_states_current, f); if (l.mode == MapLoader.Mode.RaymanArenaGC) { off_states_current = f.states[i].offset + 0x28; } else { off_states_current = f.states[i].off_state_next; } } } f.off_physical_lists = new Pointer[f.num_physical_lists]; // Offset for each list of POs f.physical_objects = new PhysicalObject[f.num_physical_lists][]; // Each list of POs. Each perso has zero/one of these lists and can switch between them. if (f.off_physical_list_first != null) { Pointer.Goto(ref reader, f.off_physical_list_first); for (uint i = 0; i < f.num_physical_lists; i++) { f.off_physical_lists[i] = Pointer.Current(reader); Pointer off_list_hdr_next = Pointer.Read(reader); if (l.mode == MapLoader.Mode.Rayman3GC) { Pointer off_list_hdr_prev = Pointer.Read(reader); Pointer off_list_hdr = Pointer.Read(reader); } Pointer off_list_start = Pointer.Read(reader); Pointer off_list_2 = Pointer.Read(reader); // is this a copy of the list or something? ushort num_entries = reader.ReadUInt16(); reader.ReadUInt16(); /*// format of list_hdr: * if (l.mode == MapLoader.Mode.Rayman3PC || l.mode == MapLoader.Mode.Rayman3GC) { * Pointer off_list_hdr_first = Pointer.Read(reader); * Pointer off_list_hdr_last = Pointer.Read(reader); * uint num_lists = reader.ReadUInt32(); // 1? * }*/ if (off_list_start != null) { Pointer.Goto(ref reader, off_list_start); f.physical_objects[i] = new PhysicalObject[num_entries]; for (uint j = 0; j < num_entries; j++) { // each entry is 0x14 Pointer off_po_scale = Pointer.Read(reader); Pointer off_po = Pointer.Read(reader); reader.ReadUInt32(); reader.ReadUInt32(); uint lastvalue = reader.ReadUInt32(); if (lastvalue != 0 && off_po != null) { Pointer curPos = Pointer.Goto(ref reader, off_po); PhysicalObject po = PhysicalObject.Read(reader, off_po); Vector3? scaleMultiplier = null; if (off_po_scale != null) { Pointer.Goto(ref reader, off_po_scale); float x = reader.ReadSingle(); float z = reader.ReadSingle(); float y = reader.ReadSingle(); scaleMultiplier = new Vector3(x, y, z); } if (po != null) { f.physical_objects[i][j] = po; po.Gao.transform.parent = f.Gao.transform; po.scaleMultiplier = scaleMultiplier; } Pointer.Goto(ref reader, curPos); } } } if (off_list_hdr_next != null) { Pointer.Goto(ref reader, off_list_hdr_next); } else { break; } } } /*if (l.mode == MapLoader.Mode.Rayman3GC) { * Pointer off_list_hdr_next = Pointer.Read(reader); * Pointer off_list_hdr_prev = Pointer.Read(reader); * Pointer off_list_hdr = Pointer.Read(reader); * //if (off_list_hdr != null) Pointer.Goto(ref reader, off_list_hdr); * } else if (l.mode == MapLoader.Mode.Rayman3PC || l.mode == MapLoader.Mode.RaymanArenaPC) { * reader.ReadUInt32(); // 0 * } else if (l.mode == MapLoader.Mode.Rayman2PC) { * Pointer off_list_hdr = Pointer.Read(reader); * //if (off_list_hdr != null) Pointer.Goto(ref reader, off_list_hdr); * } * if (l.mode == MapLoader.Mode.Rayman3PC || l.mode == MapLoader.Mode.Rayman3GC) { * Pointer off_list_hdr_1 = Pointer.Read(reader); // copy of off_subblocklist? * Pointer off_list_hdr_2 = Pointer.Read(reader); // same? * reader.ReadUInt32(); // 1? * }*/ return(f); }
public static LightInfo Read(EndianBinaryReader reader, Pointer offset) { MapLoader lo = MapLoader.Loader; LightInfo parsedLight = lo.lights.FirstOrDefault(li => li.offset == offset); if (parsedLight != null) { return(parsedLight); } //lo.print("Light offset; " + offset); /* For Rayman 3: * light struct sz = 0x110 * transformation matrix starts at 0x34 and is 0x50 long * color is at + 156(decimal) or 0x9c and is 4x 4 bytes, but it's out of range? * can be negative to create shadows maybe? * at + 252(or 0xfc) is another color * perso also has light sometimes (at offset + 28)*/ /* For R2: * 0x160 size * example: astro_00 @ 1d30c */ LightInfo l = new LightInfo(offset); l.turnedOn = reader.ReadByte(); l.castShadows = reader.ReadByte(); l.giroPhare = reader.ReadByte(); l.pulse = reader.ReadByte(); reader.ReadUInt32(); l.type = reader.ReadUInt16(); reader.ReadUInt16(); l.far = reader.ReadSingle(); l.near = reader.ReadSingle(); l.littleAlpha = reader.ReadSingle(); l.bigAlpha = reader.ReadSingle(); l.giroStep = reader.ReadSingle(); l.pulseStep = reader.ReadSingle(); if (lo.mode != MapLoader.Mode.Rayman2PC) { l.pulseMaxRange = reader.ReadSingle(); l.giroAngle = reader.ReadSingle(); reader.ReadSingle(); } l.transMatrix = Matrix.Read(reader, Pointer.Current(reader)); reader.ReadUInt32(); // 0 reader.ReadUInt32(); // 0 reader.ReadUInt32(); // 0 reader.ReadUInt32(); // 0 reader.ReadUInt32(); // 0 reader.ReadUInt32(); // 0 l.color = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); if (lo.mode != MapLoader.Mode.Rayman2PC) { l.shadowIntensity = reader.ReadSingle(); // 0 } reader.ReadByte(); reader.ReadByte(); l.paintingLightFlag = reader.ReadByte(); l.alphaLightFlag = reader.ReadByte(); l.interMinPos = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); l.exterMinPos = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); l.interMaxPos = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); l.exterMaxPos = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); reader.ReadUInt32(); reader.ReadUInt32(); reader.ReadUInt32(); l.attFactor3 = reader.ReadSingle(); l.intensityMin = reader.ReadSingle(); l.intensityMax = reader.ReadSingle(); l.background_color = new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); l.createsShadowsOrNot = reader.ReadUInt32(); lo.lights.Add(l); return(l); }