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:
parent
f75a9cae23
commit
057d8fcff2
4 changed files with 127 additions and 14 deletions
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue