soft: reuse R_LerpVerts code

This commit is contained in:
Denis Pauk 2024-03-07 18:51:14 +02:00
parent 3f20ef1bb0
commit 89a8a04334
9 changed files with 127 additions and 115 deletions

View file

@ -109,8 +109,8 @@ R_CompressNormalMDL(const float *normal)
void void
R_LerpVerts(qboolean powerUpEffect, int nverts, R_LerpVerts(qboolean powerUpEffect, int nverts,
const dxtrivertx_t *v, const dxtrivertx_t *ov, const dxtrivertx_t *v, const dxtrivertx_t *ov,
const dxtrivertx_t *verts, float *lerp, float *lerp, const float move[3],
const float move[3], const float frontv[3], const float backv[3]) const float frontv[3], const float backv[3])
{ {
int i; int i;
@ -118,7 +118,7 @@ R_LerpVerts(qboolean powerUpEffect, int nverts,
{ {
for (i = 0; i < nverts; i++, v++, ov++, lerp += 4) for (i = 0; i < nverts; i++, v++, ov++, lerp += 4)
{ {
const float *normal = r_avertexnormals[verts[i].lightnormalindex]; const float *normal = r_avertexnormals[v->lightnormalindex];
lerp[0] = move[0] + ov->v[0] * backv[0] + v->v[0] * frontv[0] + lerp[0] = move[0] + ov->v[0] * backv[0] + v->v[0] * frontv[0] +
normal[0] * POWERSUIT_SCALE; normal[0] * POWERSUIT_SCALE;

View file

@ -402,7 +402,7 @@ ReadMD5Anim(md5_model_t *anim, const char *buffer, size_t size)
md5_joint_info_t *jointInfos = NULL; md5_joint_info_t *jointInfos = NULL;
md5_baseframe_joint_t *baseFrame = NULL; md5_baseframe_joint_t *baseFrame = NULL;
float *animFrameData = NULL; float *animFrameData = NULL;
int numAnimatedComponents; int numAnimatedComponents = 0;
/* buffer has not always had final zero */ /* buffer has not always had final zero */
safe_buffer = malloc(size + 1); safe_buffer = malloc(size + 1);
@ -612,12 +612,25 @@ ReadMD5Anim(md5_model_t *anim, const char *buffer, size_t size)
animFrameData[i] = (float)strtod(token, (char **)NULL); animFrameData[i] = (float)strtod(token, (char **)NULL);
} }
if (frame_index < anim->num_frames) if (frame_index < 0 || frame_index >= anim->num_frames)
{ {
R_Printf(PRINT_ALL, "Error: unknown frame number\n");
/* broken file */
FreeModelMd5Frames(anim);
break;
}
if (!jointInfos || !baseFrame || !animFrameData)
{
R_Printf(PRINT_ALL, "Error: unknown size of frame\n");
/* broken file */
FreeModelMd5Frames(anim);
break;
}
/* Build frame skeleton from the collected data */ /* Build frame skeleton from the collected data */
BuildFrameSkeleton(jointInfos, baseFrame, animFrameData, BuildFrameSkeleton(jointInfos, baseFrame, animFrameData,
anim->skelFrames[frame_index].skelJoints, anim->num_joints); anim->skelFrames[frame_index].skelJoints, anim->num_joints);
}
token = COM_Parse(&curr_buff); token = COM_Parse(&curr_buff);
if (strcmp(token, "}")) if (strcmp(token, "}"))

View file

@ -177,7 +177,7 @@ R_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp,
vec4_t *s_lerped) vec4_t *s_lerped)
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
int *order; int *order;
float frontlerp; float frontlerp;
float alpha; float alpha;
@ -193,7 +193,7 @@ R_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp,
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ currententity->frame * paliashdr->framesize); + currententity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ currententity->oldframe * paliashdr->framesize); + currententity->oldframe * paliashdr->framesize);
@ -237,7 +237,7 @@ R_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp,
lerp = s_lerped[0]; lerp = s_lerped[0];
R_LerpVerts(colorOnly, paliashdr->num_xyz, v, ov, verts, lerp, move, frontv, backv); R_LerpVerts(colorOnly, paliashdr->num_xyz, verts, ov, lerp, move, frontv, backv);
num_mesh_nodes = paliashdr->num_meshes; num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes); mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);

View file

@ -216,7 +216,7 @@ static void
DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight) DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
int *order; int *order;
float alpha; float alpha;
vec3_t move, delta, vectors[3]; vec3_t move, delta, vectors[3];
@ -240,7 +240,7 @@ DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->frame * paliashdr->framesize); + entity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->oldframe * paliashdr->framesize); + entity->oldframe * paliashdr->framesize);
@ -295,7 +295,7 @@ DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
lerp = s_lerped[0]; lerp = s_lerped[0];
R_LerpVerts(colorOnly, paliashdr->num_xyz, v, ov, verts, lerp, move, frontv, backv); R_LerpVerts(colorOnly, paliashdr->num_xyz, verts, ov, lerp, move, frontv, backv);
YQ2_STATIC_ASSERT(sizeof(gl3_alias_vtx_t) == 9*sizeof(GLfloat), "invalid gl3_alias_vtx_t size"); YQ2_STATIC_ASSERT(sizeof(gl3_alias_vtx_t) == 9*sizeof(GLfloat), "invalid gl3_alias_vtx_t size");
@ -441,7 +441,7 @@ DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
// all in this scope is to set s_lerped // all in this scope is to set s_lerped
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
float backlerp = entity->backlerp; float backlerp = entity->backlerp;
float frontlerp = 1.0f - backlerp; float frontlerp = 1.0f - backlerp;
vec3_t move, delta, vectors[3]; vec3_t move, delta, vectors[3];
@ -449,7 +449,7 @@ DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->frame * paliashdr->framesize); + entity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->oldframe * paliashdr->framesize); + entity->oldframe * paliashdr->framesize);
@ -475,7 +475,7 @@ DrawAliasShadow(gl3_shadowinfo_t* shadowInfo)
// false: don't extrude vertices for powerup - this means the powerup shell // false: don't extrude vertices for powerup - this means the powerup shell
// is not seen in the shadow, only the underlying model.. // is not seen in the shadow, only the underlying model..
R_LerpVerts(false, paliashdr->num_xyz, v, ov, verts, s_lerped[0], move, frontv, backv); R_LerpVerts(false, paliashdr->num_xyz, verts, ov, s_lerped[0], move, frontv, backv);
} }
lheight = entity->origin[2] - shadowInfo->lightspot[2]; lheight = entity->origin[2] - shadowInfo->lightspot[2];

View file

@ -71,7 +71,7 @@ static void
DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight) DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
int *order; int *order;
float alpha; float alpha;
vec3_t move, delta, vectors[3]; vec3_t move, delta, vectors[3];
@ -94,7 +94,7 @@ DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->frame * paliashdr->framesize); + entity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->oldframe * paliashdr->framesize); + entity->oldframe * paliashdr->framesize);
@ -149,7 +149,7 @@ DrawAliasFrameLerp(dmdx_t *paliashdr, entity_t* entity, vec3_t shadelight)
lerp = s_lerped[0]; lerp = s_lerped[0];
R_LerpVerts(colorOnly, paliashdr->num_xyz, v, ov, verts, lerp, move, frontv, backv); R_LerpVerts(colorOnly, paliashdr->num_xyz, verts, ov, lerp, move, frontv, backv);
YQ2_STATIC_ASSERT(sizeof(gl4_alias_vtx_t) == 9*sizeof(GLfloat), "invalid gl4_alias_vtx_t size"); YQ2_STATIC_ASSERT(sizeof(gl4_alias_vtx_t) == 9*sizeof(GLfloat), "invalid gl4_alias_vtx_t size");
@ -313,7 +313,7 @@ DrawAliasShadow(gl4_shadowinfo_t* shadowInfo)
// all in this scope is to set s_lerped // all in this scope is to set s_lerped
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
float backlerp = entity->backlerp; float backlerp = entity->backlerp;
float frontlerp = 1.0f - backlerp; float frontlerp = 1.0f - backlerp;
vec3_t move, delta, vectors[3]; vec3_t move, delta, vectors[3];
@ -322,7 +322,7 @@ DrawAliasShadow(gl4_shadowinfo_t* shadowInfo)
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->frame * paliashdr->framesize); + entity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ entity->oldframe * paliashdr->framesize); + entity->oldframe * paliashdr->framesize);
@ -348,7 +348,7 @@ DrawAliasShadow(gl4_shadowinfo_t* shadowInfo)
// false: don't extrude vertices for powerup - this means the powerup shell // false: don't extrude vertices for powerup - this means the powerup shell
// is not seen in the shadow, only the underlying model.. // is not seen in the shadow, only the underlying model..
R_LerpVerts(false, paliashdr->num_xyz, v, ov, verts, s_lerped[0], move, frontv, backv); R_LerpVerts(false, paliashdr->num_xyz, verts, ov, s_lerped[0], move, frontv, backv);
} }
lheight = entity->origin[2] - shadowInfo->lightspot[2]; lheight = entity->origin[2] - shadowInfo->lightspot[2];

View file

@ -385,7 +385,7 @@ extern qboolean R_CullAliasMeshModel(dmdx_t *paliashdr, cplane_t *frustum,
int frame, int oldframe, vec3_t e_angles, vec3_t e_origin, vec3_t bbox[8]); int frame, int oldframe, vec3_t e_angles, vec3_t e_origin, vec3_t bbox[8]);
extern void R_LerpVerts(qboolean powerUpEffect, int nverts, extern void R_LerpVerts(qboolean powerUpEffect, int nverts,
const dxtrivertx_t *v, const dxtrivertx_t *ov, const dxtrivertx_t *v, const dxtrivertx_t *ov,
const dxtrivertx_t *verts, float *lerp, const float move[3], float *lerp, const float move[3],
const float frontv[3], const float backv[3]); const float frontv[3], const float backv[3]);
extern byte R_CompressNormalMDL(const float *normal); extern byte R_CompressNormalMDL(const float *normal);
extern vec4_t *R_VertBufferRealloc(int num); extern vec4_t *R_VertBufferRealloc(int num);

View file

@ -61,8 +61,6 @@ static const float r_avertexnormals[NUMVERTEXNORMALS][3] = {
static void R_AliasTransformVector(const vec3_t in, vec3_t out, const float xf[3][4]); static void R_AliasTransformVector(const vec3_t in, vec3_t out, const float xf[3][4]);
static void R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalvert_t *fv, dxtrivertx_t *oldv, dxtrivertx_t *newv );
void R_AliasProjectAndClipTestFinalVert(finalvert_t *fv); void R_AliasProjectAndClipTestFinalVert(finalvert_t *fv);
@ -233,6 +231,81 @@ R_AliasTransformVector(const vec3_t in, vec3_t out, const float xf[3][4] )
out[2] = DotProduct(in, xf[2]) + xf[2][3]; out[2] = DotProduct(in, xf[2]) + xf[2][3];
} }
/*
================
R_AliasTransformFinalVerts
================
*/
static void
R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints,
finalvert_t *fv, dxtrivertx_t *oldv, dxtrivertx_t *newv, vec4_t *s_lerped)
{
qboolean colorOnly;
float *lerp;
int i;
colorOnly = 0 != (currententity->flags &
(RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE |
RF_SHELL_HALF_DAM));
lerp = s_lerped[0];
R_LerpVerts(colorOnly, numpoints, newv, oldv, lerp, r_lerp_move,
r_lerp_frontv, r_lerp_backv);
for ( i = 0; i < numpoints; i++, fv++, newv++, lerp += 4)
{
float lightcos;
const float *plightnormal;
plightnormal = r_avertexnormals[newv->lightnormalindex];
fv->xyz[0] = DotProduct(lerp, aliastransform[0]) + aliastransform[0][3];
fv->xyz[1] = DotProduct(lerp, aliastransform[1]) + aliastransform[1][3];
fv->xyz[2] = DotProduct(lerp, aliastransform[2]) + aliastransform[2][3];
fv->flags = 0;
// lighting
lightcos = DotProduct (plightnormal, r_plightvec);
if (lightcos < 0)
{
int j;
for(j=0; j<3; j++)
{
int temp;
temp = r_ambientlight[j];
temp += (r_shadelight[j] * lightcos);
// clamp; because we limited the minimum ambient and shading light, we
// don't have to clamp low light, just bright
if (temp < 0)
temp = 0;
fv->cv.l[j] = temp;
}
}
else
{
memcpy(fv->cv.l, r_ambientlight, sizeof(light3_t));
}
if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE )
{
fv->flags |= ALIAS_Z_CLIP;
}
else
{
R_AliasProjectAndClipTestFinalVert( fv );
}
}
}
/* /*
================ ================
@ -249,6 +322,7 @@ R_AliasPreparePoints (const entity_t *currententity, finalvert_t *verts, const f
dstvert_t *pstverts; dstvert_t *pstverts;
dtriangle_t *ptri; dtriangle_t *ptri;
finalvert_t *pfv[3]; finalvert_t *pfv[3];
vec4_t *s_lerped;
if ((verts + s_pmdl->num_xyz) >= verts_max) if ((verts + s_pmdl->num_xyz) >= verts_max)
{ {
@ -256,12 +330,15 @@ R_AliasPreparePoints (const entity_t *currententity, finalvert_t *verts, const f
return; return;
} }
/* buffer for scalled vert from frame */
s_lerped = R_VertBufferRealloc(s_pmdl->num_xyz);
R_AliasTransformFinalVerts(currententity, R_AliasTransformFinalVerts(currententity,
s_pmdl->num_xyz, s_pmdl->num_xyz,
verts, // destination for transformed verts verts, /* destination for transformed verts */
r_lastframe->verts, // verts from the last frame r_lastframe->verts, /* verts from the last frame */
r_thisframe->verts // verts from this frame r_thisframe->verts, /* verts from this frame */
); s_lerped);
// clip and draw all triangles // clip and draw all triangles
// //
@ -409,86 +486,6 @@ R_AliasSetUpTransform(const entity_t *currententity)
aliasoldworldtransform[2][3] = currententity->oldorigin[2]; aliasoldworldtransform[2][3] = currententity->oldorigin[2];
} }
/*
================
R_AliasTransformFinalVerts
TODO: Combine with R_LerpVerts
================
*/
static void
R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalvert_t *fv, dxtrivertx_t *oldv, dxtrivertx_t *newv )
{
int i;
qboolean colorOnly = 0 != (currententity->flags &
(RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE |
RF_SHELL_HALF_DAM));
for ( i = 0; i < numpoints; i++, fv++, oldv++, newv++ )
{
float lightcos;
const float *plightnormal;
vec3_t lerped_vert;
lerped_vert[0] = r_lerp_move[0] + oldv->v[0] * r_lerp_backv[0] + newv->v[0] * r_lerp_frontv[0];
lerped_vert[1] = r_lerp_move[1] + oldv->v[1] * r_lerp_backv[1] + newv->v[1] * r_lerp_frontv[1];
lerped_vert[2] = r_lerp_move[2] + oldv->v[2] * r_lerp_backv[2] + newv->v[2] * r_lerp_frontv[2];
plightnormal = r_avertexnormals[newv->lightnormalindex];
// added double damage shell
if ( colorOnly )
{
lerped_vert[0] += plightnormal[0] * POWERSUIT_SCALE;
lerped_vert[1] += plightnormal[1] * POWERSUIT_SCALE;
lerped_vert[2] += plightnormal[2] * POWERSUIT_SCALE;
}
fv->xyz[0] = DotProduct(lerped_vert, aliastransform[0]) + aliastransform[0][3];
fv->xyz[1] = DotProduct(lerped_vert, aliastransform[1]) + aliastransform[1][3];
fv->xyz[2] = DotProduct(lerped_vert, aliastransform[2]) + aliastransform[2][3];
fv->flags = 0;
// lighting
lightcos = DotProduct (plightnormal, r_plightvec);
if (lightcos < 0)
{
int j;
for(j=0; j<3; j++)
{
int temp;
temp = r_ambientlight[j];
temp += (r_shadelight[j] * lightcos);
// clamp; because we limited the minimum ambient and shading light, we
// don't have to clamp low light, just bright
if (temp < 0)
temp = 0;
fv->cv.l[j] = temp;
}
}
else
memcpy(fv->cv.l, r_ambientlight, sizeof(light3_t));
if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE )
{
fv->flags |= ALIAS_Z_CLIP;
}
else
{
R_AliasProjectAndClipTestFinalVert( fv );
}
}
}
/* /*
================ ================
R_AliasProjectAndClipTestFinalVert R_AliasProjectAndClipTestFinalVert

View file

@ -456,6 +456,7 @@ static qboolean
RE_Init(void) RE_Init(void)
{ {
R_RegisterVariables (); R_RegisterVariables ();
R_VertBufferInit();
R_InitImages (); R_InitImages ();
Mod_Init (); Mod_Init ();
Draw_InitLocal (); Draw_InitLocal ();
@ -522,6 +523,7 @@ RE_Shutdown (void)
R_UnRegister (); R_UnRegister ();
Mod_FreeAll (); Mod_FreeAll ();
R_ShutdownImages (); R_ShutdownImages ();
R_VertBufferFree();
RE_ShutdownContext(); RE_ShutdownContext();
} }

View file

@ -403,7 +403,7 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
float *modelMatrix, int leftHandOffset, int translucentIdx, vec4_t *s_lerped) float *modelMatrix, int leftHandOffset, int translucentIdx, vec4_t *s_lerped)
{ {
daliasxframe_t *frame, *oldframe; daliasxframe_t *frame, *oldframe;
dxtrivertx_t *v, *ov, *verts; dxtrivertx_t *ov, *verts;
int *order; int *order;
float frontlerp; float frontlerp;
float alpha; float alpha;
@ -418,7 +418,7 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames frame = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ currententity->frame * paliashdr->framesize); + currententity->frame * paliashdr->framesize);
verts = v = frame->verts; verts = frame->verts;
oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames oldframe = (daliasxframe_t *)((byte *)paliashdr + paliashdr->ofs_frames
+ currententity->oldframe * paliashdr->framesize); + currententity->oldframe * paliashdr->framesize);
@ -455,7 +455,7 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
backv[i] = backlerp * oldframe->scale[i]; backv[i] = backlerp * oldframe->scale[i];
} }
R_LerpVerts(colorOnly, paliashdr->num_xyz, v, ov, verts, (float*)s_lerped, R_LerpVerts(colorOnly, paliashdr->num_xyz, verts, ov, (float*)s_lerped,
move, frontv, backv); move, frontv, backv);
num_mesh_nodes = paliashdr->num_meshes; num_mesh_nodes = paliashdr->num_meshes;