models: model always has one mesh at least

This commit is contained in:
Denis Pauk 2023-12-27 01:37:17 +02:00
parent 531dc2f872
commit 3e7bd79c5b
4 changed files with 69 additions and 103 deletions

View file

@ -283,11 +283,13 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
int version;
dmdx_t *pheader;
void *extradata;
dmdxmesh_t *mesh_nodes;
/* local copy of all values */
int skinwidth, skinheight, framesize;
int num_skins, num_xyz, num_st, num_tris, num_glcmds, num_frames;
int ofs_skins, ofs_st, ofs_tris, ofs_frames, ofs_glcmds, ofs_end;
int num_meshes, num_skins, num_xyz, num_st, num_tris, num_glcmds, num_frames;
int ofs_meshes, ofs_skins, ofs_st, ofs_tris, ofs_frames, ofs_glcmds, ofs_end;
pinmodel = (mdl_header_t *)buffer;
@ -300,6 +302,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
}
/* generate all offsets and sizes */
num_meshes = 1;
num_skins = LittleLong(pinmodel->num_skins);
skinwidth = LittleLong(pinmodel->skinwidth);
skinheight = LittleLong(pinmodel->skinheight);
@ -313,7 +316,8 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
num_frames = LittleLong(pinmodel->num_frames);
framesize = sizeof(daliasframe_t) + sizeof (dtrivertx_t) * (num_xyz - 1);
ofs_skins = 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_st = ofs_skins + num_skins * MAX_SKINNAME;
ofs_tris = ofs_st + num_st * sizeof(dstvert_t);
ofs_glcmds = ofs_tris + num_tris * sizeof(dtriangle_t);
@ -381,6 +385,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
pheader->skinheight = skinheight;
pheader->framesize = framesize;
pheader->num_meshes = num_meshes;
pheader->num_skins = num_skins;
pheader->num_xyz = num_xyz;
pheader->num_st = num_st;
@ -388,6 +393,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
pheader->num_glcmds = num_glcmds;
pheader->num_frames = num_frames;
pheader->ofs_meshes = ofs_meshes;
pheader->ofs_skins = ofs_skins;
pheader->ofs_st = ofs_st;
pheader->ofs_tris = ofs_tris;
@ -395,6 +401,11 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
pheader->ofs_glcmds = ofs_glcmds;
pheader->ofs_end = ofs_end;
/* create single mesh */
mesh_nodes = (dmdxmesh_t *)((char *)pheader + pheader->ofs_meshes);
mesh_nodes[0].start = 0;
mesh_nodes[0].num = num_glcmds;
{
int i;
const byte *curr_pos;
@ -410,7 +421,7 @@ Mod_LoadModel_MDL(const char *mod_name, const void *buffer, int modfilelen,
char *out_pos;
int skin_type;
out_pos = (char*)pheader + sizeof(*pheader);
out_pos = (char*)pheader + pheader->ofs_skins;
snprintf(out_pos + MAX_SKINNAME * i, MAX_SKINNAME, "%s#%d.tga", mod_name, i);
/* skip type / int */
@ -588,12 +599,13 @@ Mod_LoadModel_MD2(const char *mod_name, const void *buffer, int modfilelen,
dmdx_t *pheader;
dtriangle_t *pintri;
dstvert_t *pinst;
dmdxmesh_t *mesh_nodes;
int *pincmd, header_diff;
void *extradata;
int i;
/* fix for offset */
header_diff = sizeof(*pheader) - sizeof(pinmodel);
header_diff = sizeof(*pheader) - sizeof(pinmodel) + sizeof(dmdxmesh_t);
if (modfilelen < sizeof(pinmodel))
{
@ -639,21 +651,26 @@ Mod_LoadModel_MD2(const char *mod_name, const void *buffer, int modfilelen,
pheader->skinheight = pinmodel.skinheight;
pheader->framesize = pinmodel.framesize;
pheader->num_meshes = 1;
pheader->num_skins = pinmodel.num_skins;
pheader->num_xyz = pinmodel.num_xyz;
pheader->num_st = pinmodel.num_st;
pheader->num_tris = pinmodel.num_tris;
pheader->num_glcmds = pinmodel.num_glcmds;
pheader->num_frames = pinmodel.num_frames;
pheader->num_meshes = 0;
pheader->ofs_skins = header_diff + pinmodel.ofs_skins;
pheader->ofs_st = header_diff + pinmodel.ofs_st;
pheader->ofs_tris = header_diff + pinmodel.ofs_tris;
pheader->ofs_frames = header_diff + pinmodel.ofs_frames;
pheader->ofs_glcmds = header_diff + pinmodel.ofs_glcmds;
pheader->ofs_meshes = 0;
pheader->ofs_end = header_diff + pinmodel.ofs_end;
pheader->ofs_meshes = sizeof(*pheader); // just skip header and go
pheader->ofs_skins = pheader->ofs_meshes + pheader->num_meshes * sizeof(dmdxmesh_t);
pheader->ofs_st = pheader->ofs_skins + pheader->num_skins * MAX_SKINNAME;
pheader->ofs_tris = pheader->ofs_st + pheader->num_st * sizeof(dstvert_t);
pheader->ofs_glcmds = pheader->ofs_tris + pheader->num_tris * sizeof(dtriangle_t);
pheader->ofs_frames = pheader->ofs_glcmds + pheader->num_glcmds * sizeof(int);
pheader->ofs_end = pheader->ofs_frames + pheader->framesize * pheader->num_frames;
/* create single mesh */
mesh_nodes = (dmdxmesh_t *)((char *)pheader + pheader->ofs_meshes);
mesh_nodes[0].start = 0;
mesh_nodes[0].num = pheader->num_glcmds;
if (pheader->skinheight > MAX_LBM_HEIGHT)
{
@ -1041,6 +1058,7 @@ Mod_LoadModel_DKM(const char *mod_name, const void *buffer, int modfilelen,
dmdx_t dmdxheader, *pheader = NULL;
dkm_header_t header = {0};
void *extradata = NULL;
dmdxmesh_t *mesh_nodes;
int i;
if (sizeof(dkm_header_t) > modfilelen)
@ -1088,6 +1106,7 @@ Mod_LoadModel_DKM(const char *mod_name, const void *buffer, int modfilelen,
dmdxheader.framesize += header.num_xyz * sizeof(dtrivertx_t);
}
dmdxheader.num_meshes = 1;
dmdxheader.num_skins = header.num_skins;
dmdxheader.num_xyz = header.num_xyz;
dmdxheader.num_st = header.num_st;
@ -1096,7 +1115,8 @@ Mod_LoadModel_DKM(const char *mod_name, const void *buffer, int modfilelen,
dmdxheader.num_frames = header.num_frames;
/* just skip header */
dmdxheader.ofs_skins = sizeof(dmdxheader);
dmdxheader.ofs_meshes = sizeof(dmdxheader);
dmdxheader.ofs_skins = dmdxheader.ofs_meshes + dmdxheader.num_meshes * sizeof(dmdxmesh_t);
dmdxheader.ofs_st = dmdxheader.ofs_skins + dmdxheader.num_skins * MAX_SKINNAME;
dmdxheader.ofs_tris = dmdxheader.ofs_st + dmdxheader.num_st * sizeof(dstvert_t);
dmdxheader.ofs_frames = dmdxheader.ofs_tris + dmdxheader.num_tris * sizeof(dtriangle_t);
@ -1110,6 +1130,11 @@ Mod_LoadModel_DKM(const char *mod_name, const void *buffer, int modfilelen,
memcpy(pheader, &dmdxheader, sizeof(dmdxheader));
/* create single mesh */
mesh_nodes = (dmdxmesh_t *)((char *)pheader + pheader->ofs_meshes);
mesh_nodes[0].start = 0;
mesh_nodes[0].num = pheader->num_glcmds;
memcpy ((byte*)pheader + pheader->ofs_skins, (byte *)buffer + header.ofs_skins,
pheader->num_skins * MAX_SKINNAME);
Mod_LoadSTvertList (pheader,

View file

@ -246,22 +246,12 @@ R_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp)
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
R_DrawAliasDrawCommands(currententity,
order + mesh_nodes[i].start,
order + Q_min(
paliashdr->num_glcmds, mesh_nodes[i].start + mesh_nodes[i].num),
alpha, verts);
}
}
else
for (i = 0; i < num_mesh_nodes; i++)
{
R_DrawAliasDrawCommands(currententity,
order, order + paliashdr->num_glcmds,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
alpha, verts);
}
@ -357,9 +347,8 @@ R_DrawAliasShadowCommand(entity_t *currententity, int *order, int *order_end,
static void
R_DrawAliasShadow(entity_t *currententity, dmdx_t *paliashdr, int posenum)
{
int *order;
int *order, i, num_mesh_nodes;
float height = 0, lheight;
int num_mesh_nodes;
dmdxmesh_t *mesh_nodes;
lheight = currententity->origin[2] - lightspot[2];
@ -377,21 +366,12 @@ R_DrawAliasShadow(entity_t *currententity, dmdx_t *paliashdr, int posenum)
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
R_DrawAliasShadowCommand(currententity,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds, mesh_nodes[i].start + mesh_nodes[i].num),
height, lheight);
}
}
else
for (i = 0; i < num_mesh_nodes; i++)
{
R_DrawAliasShadowCommand(currententity,
order, order + paliashdr->num_glcmds,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
height, lheight);
}

View file

@ -300,22 +300,12 @@ DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
DrawAliasFrameLerpCommands(paliashdr, entity, shadelight,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
shadedots, alpha, colorOnly, verts);
}
}
else
for (i = 0; i < num_mesh_nodes; i++)
{
DrawAliasFrameLerpCommands(paliashdr, entity, shadelight,
order, order + paliashdr->num_glcmds,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
shadedots, alpha, colorOnly, verts);
}
}
@ -431,7 +421,7 @@ DrawAliasShadowCommands(int *order, int *order_end, vec3_t shadevector,
static void
DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
{
int *order;
int *order, i;
float height = 0, lheight;
int num_mesh_nodes;
dmdxmesh_t *mesh_nodes;
@ -450,7 +440,6 @@ DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
float frontlerp = 1.0f - backlerp;
vec3_t move, delta, vectors[3];
vec3_t frontv, backv;
int i;
frame = (daliasframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->frame * paliashdr->framesize);
@ -490,22 +479,13 @@ DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
DrawAliasShadowCommands(
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
shadevector, height, lheight);
}
}
else
for (i = 0; i < num_mesh_nodes; i++)
{
DrawAliasShadowCommands(
order, order + paliashdr->num_glcmds, shadevector, height, lheight);
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
shadevector, height, lheight);
}
}

View file

@ -486,23 +486,13 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
Vk_DrawAliasFrameLerpCommands(currententity,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
alpha, skin,
modelMatrix, leftHandOffset, translucentIdx, verts);
}
}
else
for (i = 0; i < num_mesh_nodes; i++)
{
Vk_DrawAliasFrameLerpCommands(currententity,
order, order + paliashdr->num_glcmds, alpha, skin,
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
alpha, skin,
modelMatrix, leftHandOffset, translucentIdx, verts);
}
}
@ -1031,7 +1021,7 @@ R_DrawAliasModel(entity_t *currententity, const model_t *currentmodel)
if (vk_shadows->value && !(currententity->flags & (RF_TRANSLUCENT | RF_WEAPONMODEL)))
{
int num_mesh_nodes;
int num_mesh_nodes, i;
dmdxmesh_t *mesh_nodes;
float model[16];
int *order;
@ -1044,21 +1034,12 @@ R_DrawAliasModel(entity_t *currententity, const model_t *currentmodel)
num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (num_mesh_nodes > 0)
for (i = 0; i < num_mesh_nodes; i++)
{
int i;
for (i = 0; i < num_mesh_nodes; i++)
{
Vk_DrawAliasShadow (
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
currententity->frame, model, currententity);
}
}
else
{
Vk_DrawAliasShadow (order, order + paliashdr->num_glcmds,
Vk_DrawAliasShadow (
order + mesh_nodes[i].start,
order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].start + mesh_nodes[i].num),
currententity->frame, model, currententity);
}
}