protected override void ReadInternal(Reader reader) { while (reader.BaseStream.Position <= reader.BaseStream.Length - 8) { uint size = reader.ReadUInt32(); long start_frame_packet = reader.BaseStream.Position; while (reader.BaseStream.Position < start_frame_packet + size - 4) { PS1StreamFrame f = Load.FromOffsetOrRead <PS1StreamFrame>(reader, Pointer.Current(reader), inline: true); if (f.num_frame == -1) { num_frames = frames[frames.Count - 1].num_frame; } frames.Add(f); } if (reader.BaseStream.Position < reader.BaseStream.Length - 8) { reader.Align(4); } } if (num_frames == 0) { num_frames = frames.Count; } }
public void UpdatePS1StreamFrame() { ClearCurrentNTTO(); if (Camera.main.orthographic) { CinematicIndex = 0; return; } if (ps1Streams != null && currentCinematic > 0) { OpenSpace.PS1.PS1Stream s = ps1Streams[currentCinematic - 1]; OpenSpace.PS1.PS1StreamFrame f = s.frames.FirstOrDefault(fr => fr.num_frame == currentFrame); if (f != null) { Dictionary <int, int> nttoForFrame = new Dictionary <int, int>(); R2PS1Loader l = MapLoader.Loader as R2PS1Loader; Camera cam = Camera.main; for (int i = 0; i < f.channels.Length; i++) { OpenSpace.PS1.PS1StreamFrameChannel c = f.channels[i]; if (c.HasFlag(OpenSpace.PS1.PS1StreamFrameChannel.StreamFlags.Camera)) { cam.transform.position = c.GetPosition(); cam.transform.rotation = c.quaternion * Quaternion.Euler(0, 180, 0); } else { GameObject gao = null; int ntto = c.NTTO; if (ntto >= 0) { if (!nttoForFrame.ContainsKey(ntto)) { nttoForFrame[ntto] = 0; } if (objectPool.ContainsKey(ntto)) { gao = objectPool[ntto][nttoForFrame[ntto]]; } if (gao != null) { gao.SetActive(true); currentNTTO.Add(gao); nttoForFrame[ntto]++; } } /*if (c.NTTO > 0) { * gao = l.levelHeader.geometricObjectsDynamic.GetGameObject(c.NTTO); * if (gao == null) gao = new GameObject("Empty 2"); * } else { * gao = new GameObject("Empty"); * }*/ /*if (c.HasFlag(PS1StreamFrameChannel.StreamFlags.Parent)) { * Debug.Log(string.Format("{0:X4}", c.flags)); * }*/ if (gao != null) { Vector3 scale = new Vector3(1f, 1f, 1f); gao.transform.localPosition = cam.transform.localPosition + c.GetPosition(); gao.transform.localRotation = c.quaternion; if (c.HasFlag(OpenSpace.PS1.PS1StreamFrameChannel.StreamFlags.Scale)) { scale = c.GetScale(0x1000); //gao.name = string.Format("{0:X4}", c.sx) + string.Format("{0:X4}", c.sy) + string.Format("{0:X4}", c.sz) + " - " + gao.name; } if (c.HasFlag(OpenSpace.PS1.PS1StreamFrameChannel.StreamFlags.FlipX)) { gao.transform.localScale = new Vector3(-scale.x, scale.y, scale.z); } else { gao.transform.localScale = scale; } //gao.transform.localScale = c.GetScale(); currentNTTO.Add(gao); } } } } } }