Show the mesh projection on the skin textures. Eukara wanted this.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6003 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-08-04 21:17:45 +00:00
parent f75a9cae23
commit 057d8fcff2
4 changed files with 127 additions and 14 deletions

View file

@ -3386,6 +3386,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct emenu
modelview_t *mods = c->dptr; modelview_t *mods = c->dptr;
skinfile_t *skin; skinfile_t *skin;
texnums_t *texnums;
if (R2D_Flush) if (R2D_Flush)
R2D_Flush(); R2D_Flush();
@ -3756,7 +3757,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct emenu
} }
else else
{ {
shader = Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup); shader = Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup, r_refdef.time, &texnums);
Draw_FunString(0, y, va("Skin %i: \"%s\", material \"%s\"", mods->skingroup, fname, shader?shader->name:"NO SHADER")); Draw_FunString(0, y, va("Skin %i: \"%s\", material \"%s\"", mods->skingroup, fname, shader?shader->name:"NO SHADER"));
} }
y+=8; y+=8;
@ -3904,7 +3905,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct emenu
{ {
if (!mods->shadertext) if (!mods->shadertext)
{ {
char *body = Shader_GetShaderBody(Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup), mods->shaderfile, sizeof(mods->shaderfile)); char *body = Shader_GetShaderBody(Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup, r_refdef.time, &texnums), mods->shaderfile, sizeof(mods->shaderfile));
if (!body) if (!body)
{ {
Draw_FunString(0, y, "Shader info not available"); Draw_FunString(0, y, "Shader info not available");
@ -3922,11 +3923,11 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct emenu
break; break;
case MV_TEXTURE: case MV_TEXTURE:
{ {
shader_t *shader = Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup); shader_t *shader = Mod_ShaderForSkin(ent.model, mods->surfaceidx, mods->skingroup, r_refdef.time, &texnums);
if (shader) if (shader)
{ {
char *t; char *t;
texnums_t *skin = shader->defaulttextures; texnums_t *skin = (texnums&&TEXVALID(texnums->base))?texnums:shader->defaulttextures;
shader = R_RegisterShader("modelviewertexturepreview", SUF_2D, "{\nprogram default2d\n{\nmap $diffuse\n}\n}\n"); shader = R_RegisterShader("modelviewertexturepreview", SUF_2D, "{\nprogram default2d\n{\nmap $diffuse\n}\n}\n");
switch(mods->textype) switch(mods->textype)
@ -3983,10 +3984,54 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct emenu
w = (float)vid.width / shader->defaulttextures->base->width; w = (float)vid.width / shader->defaulttextures->base->width;
h = (float)(vid.height-y) / shader->defaulttextures->base->height; h = (float)(vid.height-y) / shader->defaulttextures->base->height;
h = min(min(w,h), 1); h = min(w,h);
w = h*shader->defaulttextures->base->width; w = h*shader->defaulttextures->base->width;
h = h*shader->defaulttextures->base->height; h = h*shader->defaulttextures->base->height;
R2D_Image(0, y, w, h, 0, 0, 1, 1, shader); R2D_Image(0, y, w, h, 0, 0, 1, 1, shader);
{
shader_t *s = R_RegisterShader("hitbox_nodepth", SUF_NONE,
"{\n"
"polygonoffset\n"
"{\n"
"map $whiteimage\n"
"blendfunc gl_src_alpha gl_one\n"
"rgbgen vertex\n"
"alphagen vertex\n"
"nodepthtest\n"
"}\n"
"}\n");
int oldtris = cl_numstris;
int oldidx = cl_numstrisidx;
int oldvert = cl_numstrisvert;
mesh_t mesh;
memset(&mesh, 0, sizeof(mesh));
AngleVectors(vec3_origin, ent.axis[0], ent.axis[1], ent.axis[2]);
VectorInverse(ent.axis[1]);
VectorScale(ent.axis[0], w, ent.axis[0]);
VectorScale(ent.axis[1], h, ent.axis[1]);
VectorSet(ent.origin, 0, y, 0);
ent.scale = 1;
Mod_AddSingleSurface(&ent, mods->surfaceidx, s, 2);
mesh.xyz_array = cl_strisvertv + oldvert;
mesh.st_array = cl_strisvertt + oldvert;
mesh.colors4f_array[0] = cl_strisvertc + oldvert;
mesh.indexes = cl_strisidx + oldidx;
mesh.numindexes = cl_numstrisidx - oldidx;
mesh.numvertexes = cl_numstrisvert-oldvert;
cl_numstris = oldtris;
cl_numstrisidx = oldidx;
cl_numstrisvert = oldvert;
if (R2D_Flush)
R2D_Flush();
BE_DrawMesh_Single(s, &mesh, NULL, BEF_LINES);
}
} }
else else
Draw_FunString(0, y, va("%s: <NO TEXTURE>", t)); Draw_FunString(0, y, va("%s: <NO TEXTURE>", t));

View file

@ -202,7 +202,7 @@ extern int Mod_GetFrameCount (struct model_s *model);
extern qboolean Mod_GetTag (struct model_s *model, int tagnum, framestate_t *framestate, float *transforms); extern qboolean Mod_GetTag (struct model_s *model, int tagnum, framestate_t *framestate, float *transforms);
extern int Mod_TagNumForName (struct model_s *model, const char *name); extern int Mod_TagNumForName (struct model_s *model, const char *name);
void Mod_AddSingleSurface(struct entity_s *ent, int surfaceidx, shader_t *shader, qboolean normals); void Mod_AddSingleSurface(struct entity_s *ent, int surfaceidx, shader_t *shader, int mode);
int Mod_GetNumBones(struct model_s *model, qboolean allowtags); int Mod_GetNumBones(struct model_s *model, qboolean allowtags);
int Mod_GetBoneRelations(struct model_s *model, int firstbone, int lastbone, framestate_t *fstate, float *result); int Mod_GetBoneRelations(struct model_s *model, int firstbone, int lastbone, framestate_t *fstate, float *result);
int Mod_GetBoneParent(struct model_s *model, int bonenum); int Mod_GetBoneParent(struct model_s *model, int bonenum);

View file

@ -2110,7 +2110,10 @@ qboolean Alias_GAliasBuildMesh(mesh_t *mesh, vbo_t **vbop, galiasinfo_t *inf, in
#ifndef SERVERONLY #ifndef SERVERONLY
//used by the modelviewer. //used by the modelviewer.
void Mod_AddSingleSurface(entity_t *ent, int surfaceidx, shader_t *shader, qboolean normals) //mode 0: wireframe
//mode 1: normal pegs
//mode 2: 2d projection.
void Mod_AddSingleSurface(entity_t *ent, int surfaceidx, shader_t *shader, int mode)
{ {
scenetris_t *t; scenetris_t *t;
vecV_t *posedata = NULL; vecV_t *posedata = NULL;
@ -2165,8 +2168,65 @@ void Mod_AddSingleSurface(entity_t *ent, int surfaceidx, shader_t *shader, qbool
m = b->mesh[meshidx]; m = b->mesh[meshidx];
if (mode == 2 && m->st_array)
{ //2d wireframe (using texture coords instead of modelspace)
if (cl_numstris == cl_maxstris)
{
cl_maxstris+=8;
cl_stris = BZ_Realloc(cl_stris, sizeof(*cl_stris)*cl_maxstris);
}
t = &cl_stris[cl_numstris++];
t->shader = shader;
t->flags = BEF_LINES;
t->firstidx = cl_numstrisidx;
t->firstvert = cl_numstrisvert;
if (t->flags&BEF_LINES)
t->numidx = m->numindexes*2;
else
t->numidx = m->numindexes;
t->numvert = m->numvertexes;
if (cl_numstrisidx+t->numidx > cl_maxstrisidx)
{
cl_maxstrisidx=cl_numstrisidx+t->numidx;
cl_strisidx = BZ_Realloc(cl_strisidx, sizeof(*cl_strisidx)*cl_maxstrisidx);
}
if (cl_numstrisvert+m->numvertexes > cl_maxstrisvert)
cl_stris_ExpandVerts(cl_numstrisvert+m->numvertexes);
for (i = 0; i < m->numvertexes; i++)
{
VectorMA(vec3_origin, m->st_array[i][0], ent->axis[0], tmp);
VectorMA(tmp, m->st_array[i][1], ent->axis[1], tmp);
VectorMA(tmp, 0, ent->axis[2], tmp);
VectorMA(ent->origin, ent->scale, tmp, cl_strisvertv[t->firstvert+i]);
Vector2Set(cl_strisvertt[t->firstvert+i], 0.5, 0.5);
Vector4Set(cl_strisvertc[t->firstvert+i], 1, 1, 1, 0.1);
}
if (t->flags&BEF_LINES)
{
for (i = 0; i < m->numindexes; i+=3)
{
cl_strisidx[cl_numstrisidx++] = m->indexes[i+0];
cl_strisidx[cl_numstrisidx++] = m->indexes[i+1];
cl_strisidx[cl_numstrisidx++] = m->indexes[i+1];
cl_strisidx[cl_numstrisidx++] = m->indexes[i+2];
cl_strisidx[cl_numstrisidx++] = m->indexes[i+2];
cl_strisidx[cl_numstrisidx++] = m->indexes[i+0];
}
}
else
{
for (i = 0; i < m->numindexes; i++)
cl_strisidx[cl_numstrisidx+i] = m->indexes[i];
cl_numstrisidx += m->numindexes;
}
cl_numstrisvert += m->numvertexes;
continue;
}
posedata = m->xyz_array; posedata = m->xyz_array;
normdata = normals?m->normals_array:NULL; normdata = (mode==1)?m->normals_array:NULL;
#ifdef SKELETALMODELS #ifdef SKELETALMODELS
if (m->numbones) if (m->numbones)
{ //intended shader might have caused it to use skeletal stuff. { //intended shader might have caused it to use skeletal stuff.
@ -2199,7 +2259,7 @@ void Mod_AddSingleSurface(entity_t *ent, int surfaceidx, shader_t *shader, qbool
posedata = m->xyz_array; posedata = m->xyz_array;
} }
if (normdata) if (normdata)
{ { //show small pegs at each vertex
if (cl_numstris == cl_maxstris) if (cl_numstris == cl_maxstris)
{ {
cl_maxstris+=8; cl_maxstris+=8;
@ -2242,8 +2302,8 @@ void Mod_AddSingleSurface(entity_t *ent, int surfaceidx, shader_t *shader, qbool
cl_numstrisidx += i*2; cl_numstrisidx += i*2;
cl_numstrisvert += i*2; cl_numstrisvert += i*2;
} }
if (!normals) else if (mode == 0)
{ { //regular wireframe
if (cl_numstris == cl_maxstris) if (cl_numstris == cl_maxstris)
{ {
cl_maxstris+=8; cl_maxstris+=8;
@ -5541,10 +5601,13 @@ qboolean Mod_FrameInfoForNum(model_t *model, int surfaceidx, int num, char **nam
} }
#ifndef SERVERONLY #ifndef SERVERONLY
shader_t *Mod_ShaderForSkin(model_t *model, int surfaceidx, int num) shader_t *Mod_ShaderForSkin(model_t *model, int surfaceidx, int num, float time, texnums_t **out_texnums)
{ {
galiasinfo_t *inf; galiasinfo_t *inf;
galiasskin_t *skin; galiasskin_t *skin;
skinframe_t *skinframe;
*out_texnums = NULL;
if (!model || model->loadstate != MLS_LOADED) if (!model || model->loadstate != MLS_LOADED)
{ {
@ -5572,7 +5635,12 @@ shader_t *Mod_ShaderForSkin(model_t *model, int surfaceidx, int num)
if (!inf || num >= inf->numskins) if (!inf || num >= inf->numskins)
return NULL; return NULL;
skin = inf->ofsskins; skin = inf->ofsskins;
return skin[num].frame[0].shader; skin += num;
skinframe = skin->frame;
if (skin->numframes)
skinframe += (int)(time*skin->skinspeed)%skin->numframes;
*out_texnums = &skinframe->texnums;
return skinframe->shader;
default: default:
return NULL; return NULL;
} }

View file

@ -266,7 +266,7 @@ void Mod_DestroyMesh(galiasinfo_t *galias);
void Alias_FlushCache(void); void Alias_FlushCache(void);
void Alias_Shutdown(void); void Alias_Shutdown(void);
void Alias_Register(void); void Alias_Register(void);
shader_t *Mod_ShaderForSkin(model_t *model, int surfaceidx, int num); shader_t *Mod_ShaderForSkin(model_t *model, int surfaceidx, int num, float time, texnums_t **out_texnums);
const char *Mod_SkinNameForNum(model_t *model, int surfaceidx, int num); const char *Mod_SkinNameForNum(model_t *model, int surfaceidx, int num);
const char *Mod_SurfaceNameForNum(model_t *model, int num); const char *Mod_SurfaceNameForNum(model_t *model, int num);
const char *Mod_FrameNameForNum(model_t *model, int surfaceidx, int num); const char *Mod_FrameNameForNum(model_t *model, int surfaceidx, int num);