My guess is they wanted to remove this scan point for some reason and it was easier to just move it behind the wall than to actually delete it. Or they didn't want to actually delete it in case they wanted to put it back, or something.
another idea is they were playtesting it both ways and either left the scan point out of bounds rather than deleting it for some reason, or intended to move it back in but forgot.
LOL wow. I just set up PWE to render the invisible X-Ray platforms (since the black box that was appearing over them before are actually invisible now with materials being rendered correctly...).
Turns out the invisible platforms in Root Cave are actually from... Phendrana. (Ruined Courtyard)
Here's a little bit of documentation on the CMDL format; this is complete aside from a few values in the submesh headers
Quote:
// This is how CMDL is laid out: different parts of the file are split up into separate sections. The header of the file contains the number of sections and their sizes. Each section is 32-byte aligned. // The first section is the materials, immediately after the header, and from then on section splits are generally at points where the type of data changes. For instance, vertex coordinates are a section, normals are a section, each submesh is a section, etc.
class cmdl { // Header struct cmdl_header { u32 deadbabe; u32 version; // Prime: 2, Echoes Demo: 3, Echoes: 4, Corruption: 5 u32 flags; // Bit 1 likely does nothing; Bit 2 marks whether normals are stored as shorts or floats; Bit 3 enables the short UV array float AABB[6]; u32 section_count; u32 material_set_count; std::vector<u32> section_sizes; } header;
// Materials struct material_set { u32 texture_count; std::vector<u32> texture_IDs; u32 material_count; std::vector<u32> material_offsets; // These offsets point to the end of each material, not the start. Offsets are relative to the start of the first material.
// Mesh struct mesh { // There's no way to tell the number of elements in these arrays in advance. Best you can do is take the size of the entire section and divide it. std::vector<float> pos_array; std::vector<float> nrm_array; // If the normals are shorts, divide them by the submesh's mantissa value (always 0x8000) to get the float value std::vector<u32> color_array; // This is not used by anything as far as I know. Data format (u32) is a guess. std::vector<float> float_uv_array; std::vector<u16> short_uv_array; // Only present if bit 3 is set on the flags value in the header. Read the same way as short normals. This is not used by anything on CMDL and is always listed with a size of 0.
u32 submesh_count; std::vector<u32> submesh_offsets; // These offsets point to the end of each submesh, not the start. Offsets are relative to the start of the first submesh.
struct submesh { float pivot[3]; // Basically just the submesh's position value u32 materialID; u16 mantissa; // This is the number that short normals are divided by u16 primitive_table_size; // This value usually works, but it's not 100% reliable; occasionally the table is actually bigger than this value says it is (examples: Phendrana Ridley model, Samus's ship in Echoes). Use the section size or the submesh end offset to detect the end of the table instead. u32 unknown1; u32 unknown2; u32 extra_data_size; // Always 0 on CMDL float unknown3[3]; // A normalized vector; purpose unknown // Two extra u16s are present here on Echoes CMDLs std::vector<u8> extra_data; // Always empty on CMDL // Pad to multiple of 32 before primitive data begins
struct primitive { u8 primitive_type; // Top five bits indicate primitive type. Bottom three bits indicate vertex attribute format. u16 vertex_count; struct primitive_vertex { // Check the vertex attribute flags on the material to tell which of these attributes are actually present. Echoes models can have an extra attribute present before pos. u16 pos; u16 nrm; u16 color0; u16 color1; u16 uv0; u16 uv1; u16 uv2; u16 uv3; u16 uv4; u16 uv5; u16 uv6; }; std::vector<primitive_vertex> vert_array; }; std::vector<primitive> primitive_table;
Tanabe: Now that I think about it, you can choose the difficulty level as well. While in the American version, partly because of time issues, we made it so this was chosen directly by the player, in the Japanese version, we wanted to add a bit of "Nintendo flavor" to it, so the difficulty is decided by answering to a questionnaire from the Galactic Federation. That was an idea that came from Retro Studios… After you answer the questionnaire, they will tell you, "This is the difficulty level we would like to recommend to you."
Iwata: The idea of a questionnaire from the Galactic Federation is very interesting, isn't it? (Laughs)
Parax, that unknown set of values, it's a bounding box, It's just never properly initialized in CMDLs, but it's always reliable on MREAs. I'm guessing it gets filled in at runtime and is used as an OBB for ragdoll physics. And since MREAs don't have ragdolls it makes since to fill that data in.
Well, the thing is, even if there's a bounding box there in MREA, there's also more data present in the MREA submesh header. The submesh header is 0x40 bytes long in CMDL and 0x60 bytes long in MREA. So the presence of a bounding box there in MREA doesn't necessarily mean that's what it is in CMDL.
What I would do to test that is fill it in with the minimum and maximum values used for each mesh, if it matches up properly that's probably what it's for, I'll give it a test real quick.
u16 primitive_table_size; // This value usually works, but it's not 100% reliable; occasionally the table is actually bigger than this value says it is (examples: Phendrana Ridley model, Samus's ship in Echoes). Use the section size or the submesh end offset to detect the end of the table instead. // There are a bunch of unknown 32-bit values here. The primitive table begins at (submesh start offset + 0x40).
} mesh; };
Could these unknowns be a Vertex Declaration? Not that its uncommon for games to have a fixed vertex decl but just seems like the right place for it.