new mapster mouse aiming: now handles masked walls, fixed searchwall determination when aiming at ceiling/floor

git-svn-id: https://svn.eduke32.com/eduke32@1462 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2009-07-17 21:47:04 +00:00
parent f0f56a6738
commit c25ee18b98
3 changed files with 67 additions and 55 deletions

View file

@ -510,6 +510,15 @@ CANCEL:
ExtAnalyzeSprites(); ExtAnalyzeSprites();
#endif #endif
drawmasks(); drawmasks();
#ifdef POLYMER
if (rendmode == 4)
{
extern void polymer_alt_editorselect(void);
if (searchit==2)
polymer_alt_editorselect();
}
#endif
#ifdef M32_SHOWDEBUG #ifdef M32_SHOWDEBUG
M32_drawdebug(); M32_drawdebug();
#endif #endif

View file

@ -843,11 +843,6 @@ void polymer_drawrooms(int32_t daposx, int32_t daposy, int32_t da
curmodelviewmatrix = rootmodelviewmatrix; curmodelviewmatrix = rootmodelviewmatrix;
// #ifdef M32_ALTAIMING
// only showcase for now...
if (searchit == 2) polymer_alt_editorselect();
// #endif
// build globals used by rotatesprite // build globals used by rotatesprite
viewangle = daang; viewangle = daang;
globalang = (daang&2047); globalang = (daang&2047);
@ -1553,6 +1548,33 @@ static void polymer_displayrooms(int16_t dacursectnum)
GLfloat qverts[QNUM*3]; GLfloat qverts[QNUM*3];
GLfloat qcolors[QNUM*3]; GLfloat qcolors[QNUM*3];
int qvertcount = 0; int qvertcount = 0;
static void polymer_m32_debug()
{
// debug code for new Mapster32 mouse aim
if (qvertcount > 0)
{
int ii;
bglPushAttrib(GL_ENABLE_BIT);
bglDisable(GL_TEXTURE_2D);
bglDisable(GL_DEPTH_TEST);
bglBegin(GL_LINE_LOOP);
for (ii=0; ii<qvertcount; ii++)
{
if (qverts[3*ii]==0 && qverts[3*ii+1]==0 && qverts[3*ii+2]==0)
{
bglEnd();
bglBegin(GL_LINE_LOOP);
continue;
}
bglColor4f(qcolors[(3*ii)+0],qcolors[(3*ii)+1],qcolors[(3*ii)+2],1.0);
bglVertex3f(qverts[(3*ii)+0],qverts[(3*ii)+1],qverts[(3*ii)+2]);
}
qvertcount=0;
bglEnd();
bglPopAttrib();
}
}
#endif #endif
static void polymer_drawplane(_prplane* plane) static void polymer_drawplane(_prplane* plane)
@ -1599,32 +1621,6 @@ static void polymer_drawplane(_prplane* plane)
// bglEnd(); // bglEnd();
// bglEnable(GL_TEXTURE_2D); // bglEnable(GL_TEXTURE_2D);
#ifdef M32_SHOWDEBUG
// debug code for new Mapster32 mouse aim
if (qvertcount > 0)
{
bglPushAttrib(GL_ENABLE_BIT);
bglDisable(GL_TEXTURE_2D);
bglDisable(GL_DEPTH_TEST);
int ii;
bglBegin(GL_LINE_LOOP);
for (ii=0; ii<qvertcount; ii++)
{
if (qverts[3*ii]==0 && qverts[3*ii+1]==0 && qverts[3*ii+2]==0)
{
bglEnd();
bglBegin(GL_LINE_LOOP);
continue;
}
bglColor4f(qcolors[(3*ii)+0],qcolors[(3*ii)+1],qcolors[(3*ii)+2],1.0);
bglVertex3f(qverts[(3*ii)+0],qverts[(3*ii)+1],qverts[(3*ii)+2]);
}
qvertcount=0;
bglEnd();
bglPopAttrib();
}
#endif
bglNormal3f((float)(plane->plane[0]), (float)(plane->plane[1]), (float)(plane->plane[2])); bglNormal3f((float)(plane->plane[0]), (float)(plane->plane[1]), (float)(plane->plane[2]));
if (plane->vbo && (pr_vbos > 0)) if (plane->vbo && (pr_vbos > 0))
@ -1952,18 +1948,15 @@ void polymer_alt_editorselect(void)
continue; continue;
{ {
GLfloat coeff = -d/nnormsq;
GLfloat pointonplane[3] = {coeff*a, coeff*b, coeff*c};
GLfloat vec[3] = {x-pointonplane[0], y-pointonplane[1], z-pointonplane[2]};
_prplane *pp; _prplane *pp;
dist = fabs((a*vec[0] + b*vec[1] + c*vec[2])/nnorm); dist = fabs(a*x + b*y + c*z + d);
if (dist > bestdist) if (dist > bestdist)
continue; continue;
// TODO: the parallax cases... // TODO: the parallax cases...
for (what=0; what < (wal->nextsector>=0?2:1); what++) for (what=0; what < (wal->nextsector>=0?3:1); what++)
{ {
GLfloat v1[3], v2[3], v3[3], v4[3], v12[3], v34[3], v1p_r[3], v3p_r[3]; GLfloat v1[3], v2[3], v3[3], v4[3], v12[3], v34[3], v1p_r[3], v3p_r[3];
GLfloat v23[3], v41[3], v2p_r[3], v4p_r[3]; GLfloat v23[3], v41[3], v2p_r[3], v4p_r[3];
@ -1981,14 +1974,13 @@ void polymer_alt_editorselect(void)
continue; continue;
pp=&w->over; pp=&w->over;
} }
/*
else if (what==2) else if (what==2)
{ {
if (!(wal->cstat&16) && !(wal->cstat&32)) if (!(wal->cstat&16) && !(wal->cstat&32))
continue; continue;
pp=&w->mask; pp=&w->mask;
} }
*/
Bmemcpy(v1, &pp->buffer[0], 3*sizeof(GLfloat)); Bmemcpy(v1, &pp->buffer[0], 3*sizeof(GLfloat));
Bmemcpy(v2, &pp->buffer[5], 3*sizeof(GLfloat)); Bmemcpy(v2, &pp->buffer[5], 3*sizeof(GLfloat));
Bmemcpy(v3, &pp->buffer[10], 3*sizeof(GLfloat)); Bmemcpy(v3, &pp->buffer[10], 3*sizeof(GLfloat));
@ -2073,11 +2065,8 @@ void polymer_alt_editorselect(void)
{ {
GLdouble nnormsq = a*a + b*b + c*c; GLdouble nnormsq = a*a + b*b + c*c;
GLdouble nnorm = sqrt(nnormsq); // GLdouble nnorm = sqrt(nnormsq);
GLfloat coeff = -d/nnormsq; GLdouble dist = dist = fabs(a*x + b*y + c*z + d);
GLfloat pointonplane[3] = {coeff*a, coeff*b, coeff*c};
GLfloat vec[3] = {x-pointonplane[0], y-pointonplane[1], z-pointonplane[2]};
GLdouble dist = fabs((a*vec[0] + b*vec[1] + c*vec[2])/nnorm);
if (dist > bestdist) if (dist > bestdist)
continue; continue;
@ -2157,11 +2146,11 @@ nextsector:
if (bestsec==i) if (bestsec==i)
{ {
int16_t k, bestk=0; int16_t k, bestk=0;
GLfloat bestwdistsq = FLT_MAX, wdistsq, wnorm; GLfloat bestwdistsq = FLT_MAX, wdistsq;
GLfloat w1[2], w2[2], w21[2], pw1[2], pw2[2]; GLfloat w1[2], w2[2], w21[2], pw1[2], pw2[2];
GLfloat ptonline[2]; GLfloat ptonline[2];
GLfloat scrvxz[2]={scrv[0],scrv[2]}; GLfloat scrvxz[2]={scrv[0],scrv[2]};
GLfloat scrvxznorm, scrvxzn[2]; GLfloat scrvxznorm, scrvxzn[2], scrpxz[2];
GLfloat w1d, w2d; GLfloat w1d, w2d;
walltype *wal = &wall[sec->wallptr]; walltype *wal = &wall[sec->wallptr];
for (k=0; k<sec->wallnum; k++) for (k=0; k<sec->wallnum; k++)
@ -2181,13 +2170,14 @@ nextsector:
w1d = dot2f(scrvxzn,pw1); w1d = dot2f(scrvxzn,pw1);
w2d = dot2f(scrvxzn,pw2); w2d = dot2f(scrvxzn,pw2);
w2d = -w2d; w2d = -w2d;
if (w1d < 0 || w2d < 0 || w1d + w2d < 0.01) if (w1d <= 0 || w2d <= 0)
continue; continue;
wnorm = sqrt(dot2f(w21,w21)); ptonline[0] = w2[0]+(w2d/(w1d+w2d))*w21[0];
ptonline[0] = w2[0]+(wnorm*w2d/(w1d+w2d))*w21[0]; ptonline[1] = w2[1]+(w2d/(w1d+w2d))*w21[1];
ptonline[1] = w2[1]+(wnorm*w2d/(w1d+w2d))*w21[1]; relvec2f(p,ptonline, scrpxz);
if (dot2f(scrvxz,scrpxz)<0)
wdistsq = (ptonline[0]-p[0])*(ptonline[0]-p[0]) + (ptonline[1]-p[1])*(ptonline[1]-p[1]); continue;
wdistsq = dot2f(scrpxz,scrpxz);
if (wdistsq < bestwdistsq) if (wdistsq < bestwdistsq)
{ {
bestk = k; bestk = k;
@ -2205,6 +2195,17 @@ nextsector:
} }
} }
if (bestwhat >= 0)
{
searchstat = bestwhat;
searchsector = bestsec;
searchwall = bestwall;
searchit = 0;
}
#ifdef M32_SHOWDEBUG
polymer_m32_debug();
#endif
} }
// SECTORS // SECTORS

View file

@ -4376,7 +4376,9 @@ static void Keys3d(void)
{ {
case 0: case 0:
case 4: case 4:
drawtileinfo("Current",WIND1X,WIND1Y,wall[searchwall].picnum,wall[searchwall].shade, drawtileinfo("Current",WIND1X,WIND1Y,
searchstat==0 ? wall[searchwall].picnum : wall[searchwall].overpicnum,
wall[searchwall].shade,
wall[searchwall].pal,wall[searchwall].cstat,wall[searchwall].lotag, wall[searchwall].pal,wall[searchwall].cstat,wall[searchwall].lotag,
wall[searchwall].hitag,wall[searchwall].extra); wall[searchwall].hitag,wall[searchwall].extra);