models: mdl fix texture coordinates

This commit is contained in:
Denis Pauk 2024-03-15 23:14:07 +02:00
parent 25d60b826e
commit b6dc5ac8ad
2 changed files with 26 additions and 10 deletions

View file

@ -36,14 +36,14 @@ Models support:
| Format | Original Game | Frame vertex | Comments | | Format | Original Game | Frame vertex | Comments |
| ------ | --------------- | ------------ | ------------------------------------------------- | | ------ | --------------- | ------------ | ------------------------------------------------- |
| mdl | Quake 1 | 8 bit | could be issues with textures | | mdl | Quake 1 | 8 bit | unsupported grouped textures |
| md2 | Quake 2 | 8 bit | full support | | md2 | Quake 2 | 8 bit | full support |
| md2 | Anachronox | 8/10/16 bit | incorrect normals, does no suport tagged surfaces | | md2 | Anachronox | 8/10/16 bit | incorrect normals, does no suport tagged surfaces |
| fm | Heretic 2 | 8 bit | show all meshes, | | fm | Heretic 2 | 8 bit | show all meshes, |
| dkm | Daikatana DKM1 | 8 bit | unchecked with game | | dkm | Daikatana DKM1 | 8 bit | unchecked with game |
| dkm | Daikatana DKM2 | 10 bit | unchecked with game, incorrect normals | | dkm | Daikatana DKM2 | 10 bit | unchecked with game, incorrect normals |
| md3 | Quake 3 | 16 bit | show all meshes, no tags support, unchecked, slow | | md3 | Quake 3 | 16 bit | show all meshes, no tags support, unchecked |
| md5 | Doom 3/Quake 4 | float | requires md2 for skins, show all meshes, slow | | md5 | Doom 3/Quake 4 | float | requires md2 for skins, show all meshes |
All models support only single texture for all meshes and only up to 255 frames. All models support only single texture for all meshes and only up to 255 frames.

View file

@ -650,7 +650,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
ofs_meshes = sizeof(*pheader); // just skip header and go ofs_meshes = sizeof(*pheader); // just skip header and go
ofs_skins = ofs_meshes + num_meshes * sizeof(dmdxmesh_t); ofs_skins = ofs_meshes + num_meshes * sizeof(dmdxmesh_t);
ofs_st = ofs_skins + num_skins * MAX_SKINNAME; ofs_st = ofs_skins + num_skins * MAX_SKINNAME;
ofs_tris = ofs_st + num_st * sizeof(dstvert_t); ofs_tris = ofs_st + num_st * sizeof(dstvert_t) * 2;
ofs_glcmds = ofs_tris + num_tris * sizeof(dtriangle_t); ofs_glcmds = ofs_tris + num_tris * sizeof(dtriangle_t);
ofs_frames = ofs_glcmds + num_glcmds * sizeof(int); ofs_frames = ofs_glcmds + num_glcmds * sizeof(int);
ofs_imgbit = ofs_frames + framesize * frame_count; ofs_imgbit = ofs_frames + framesize * frame_count;
@ -671,7 +671,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
pheader->num_meshes = num_meshes; pheader->num_meshes = num_meshes;
pheader->num_skins = num_skins; pheader->num_skins = num_skins;
pheader->num_xyz = num_xyz; pheader->num_xyz = num_xyz;
pheader->num_st = num_st; pheader->num_st = num_st * 2;
pheader->num_tris = num_tris; pheader->num_tris = num_tris;
pheader->num_glcmds = num_glcmds; pheader->num_glcmds = num_glcmds;
pheader->num_imgbit = 8; pheader->num_imgbit = 8;
@ -715,13 +715,21 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
for(i = 0; i < num_st; i++) for(i = 0; i < num_st; i++)
{ {
int s, t;
/* Compute texture coordinates */ /* Compute texture coordinates */
poutst[i].s = LittleLong(texcoords[i].s); s = LittleLong(texcoords[i].s);
poutst[i].t = LittleLong(texcoords[i].t); t = LittleLong(texcoords[i].t);
poutst[i * 2].s = s;
poutst[i * 2].t = t;
poutst[i * 2 + 1].s = s;
poutst[i * 2 + 1].t = t;
if (texcoords[i].onseam) if (texcoords[i].onseam)
{ {
poutst[i].s += skinwidth * 0.5f; /* Backface */ /* Backface */
poutst[i * 2 + 1].s += skinwidth >> 1;
} }
} }
} }
@ -742,8 +750,16 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
for (j = 0; j < 3; j++) for (j = 0; j < 3; j++)
{ {
pouttri[i].index_xyz[j] = LittleLong(triangles[i].vertex[j]); int index;
pouttri[i].index_st[j] = pouttri[i].index_xyz[j];
index = LittleLong(triangles[i].vertex[j]);
pouttri[i].index_xyz[j] = index;
pouttri[i].index_st[j] = index * 2;
if (!triangles[i].facesfront)
{
pouttri[i].index_st[j] ++;
}
} }
} }
} }