コード例 #1
0
        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);
        }
コード例 #2
0
 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;
         });
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }