B
BlitzNCS
Guest
MrAdults, do you mind adding an option to flip the textures to Mesh2rdm when you export? All the UV maps are flipped when i export to SMD, so it'd be a lot easier 
Just a suggestion.
Just a suggestion.

Eh, I should have said relative inexperience. I haven't made anything major, nothing 3D either.How exactly do you end up spending this much time in front of a hex editor, equipped with, seemingly, a good amount of rendering/geometry knowledge, and not have programming experience? What are you, some kind of hardcore scripter?![]()
Ummm do I know you?I *said* you guys had accessYou only notice now?
Geez. I'm so underappricated![]()
Sure, copy-paste as much as you like. Although a little thank you with link to my web site somewhere for all my hard work would be nice.
- First off, is it okay with you if I use stuff from your forum and blog posts for the wiki article? Or, what I mean to ask is, how much copying & pasting can I get away with? Most stuff I'll end up paraphrasing, but there are chunks that already stand fine on their own for the article.
Yep, no doubt about it. However, rather than being 1 byte, the index is 4096-based - if the bone count exceeds 255 the full WORD bit layout is changed appropriately. No idea why this is the case for so many index values in GMO files.
- Just to make sure, 0x8041 is confirmed to be the parent bone? (
As you might've guessed, that was just some sloppiness in where I was re-scaling non-float coordinates after interpreting them. I've since cleaned my own code up as well, which makes how those scale-and-bias values are used less confusing to the reader:
- For 0x8015 Scale and Bias, instead of just multiplying a coordinate by Scale, you multiply UV coordinates by Scale*2.0 and vertex positions by Scale*2.0/65535.0 -- why is that?
for (int i = 0; i < totalArrays; i++) { gmoIntAr_t *ar = &allArrays[i]; for (int j = 0; j < ar->numVerts; j++) { gmoIntVert_t *v = ar->verts+j; if (uvScales) { v->uv[0] = v->uv[0]*2.0f*uvScales[2] + uvScales[0]; v->uv[1] = v->uv[1]*2.0f*uvScales[3] + uvScales[1]; } if (posScales) { v->pos[0] = v->pos[0]*2.0f*posScales[3] + posScales[0]; v->pos[1] = v->pos[1]*2.0f*posScales[4] + posScales[1]; v->pos[2] = v->pos[2]*2.0f*posScales[5] + posScales[2]; } } }
I would call them vertex-referenced bones. After all, the bones themselves aren't weighted, the vertices are weighted to them.
- Um... bones that have vertices weighted to them-- what would you call them? "Bones that have vertices weighted to them" is a little wordy, and I don't know if "weighted bones" makes any sense or not.
I had documented primType as a full int in my spec. However, the first 2 bytes of it actually seem to be responsible for dictating the index format. If the first byte is 3, it's triangles, if it's 4, it's quads. I have never seen any other value. If the second byte is non-0, it's "unindexed".
- 0x8066 Mesh Index Data... you've mentioned triangle strips, so I guess that means you've revised this chunk since your big blog post (which makes no mention of them). Can you give us an update on that? I've got some info on it as well, but it includes some big leaps of faith which, if they're wrong, are better off not being out there and confusing people (not to mention needlessly bruising my ego
).