more matrix cleanups

master
Lee Salzman 2013-02-27 03:26:17 +02:00
parent 2114cc7928
commit 76b5ca993e
4 changed files with 73 additions and 49 deletions

View File

@ -2302,28 +2302,35 @@ void drawdamagecompass(int w, int h)
{
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1, 0, 0, damagecompassalpha/100.0f);
varray::enable();
varray::defattrib(varray::ATTRIB_VERTEX, 3, GL_FLOAT);
varray::begin(GL_TRIANGLES);
}
dirs++;
glPushMatrix();
glTranslatef(w/2, h/2, 0);
glRotatef(i*45, 0, 0, 1);
glTranslatef(0, -size/2.0f-min(h, w)/4.0f, 0);
float logscale = 32,
scale = log(1 + (logscale - 1)*dcompass[i]) / log(logscale);
glScalef(size*scale, size*scale, 0);
glBegin(GL_TRIANGLES);
glVertex3f(1, 1, 0);
glVertex3f(-1, 1, 0);
glVertex3f(0, 0, 0);
glEnd();
glPopMatrix();
scale = log(1 + (logscale - 1)*dcompass[i]) / log(logscale),
offset = -size/2.0f-min(h, w)/4.0f;
matrix3x4 m;
m.identity();
m.translate(w/2, h/2, 0);
m.rotate_around_z(i*45*RAD);
m.transformedtranslate(0, offset, 0);
m.scale(size*scale);
varray::attrib(m.transform(vec2(1, 1)));
varray::attrib(m.transform(vec2(-1, 1)));
varray::attrib(m.transform(vec2(0, 0)));
// fade in log space so short blips don't disappear too quickly
scale -= float(curtime)/damagecompassfade;
dcompass[i] = scale > 0 ? (pow(logscale, scale) - 1) / (logscale - 1) : 0;
}
if(dirs)
{
varray::end();
varray::disable();
}
}
int damageblendmillis = 0;

View File

@ -377,83 +377,75 @@ struct meterrenderer : listrenderer
void startrender()
{
glDisable(GL_BLEND);
varray::enable();
varray::defattrib(varray::ATTRIB_VERTEX, 3, GL_FLOAT);
}
void endrender()
{
varray::disable();
glEnable(GL_BLEND);
}
void renderpart(listparticle *p, const vec &o, const vec &d, int blend, int ts, uchar *color)
{
int basetype = type&0xFF;
glPushMatrix();
float scale = p->size/80.0f;
GLfloat billboardmatrix[16] =
{
scale*camright.x, scale*camright.y, scale*camright.z, 0,
-scale*camup.x, -scale*camup.y, -scale*camup.z, 0,
-scale*camdir.x, -scale*camdir.y, -scale*camdir.z, 0,
o.x, o.y, o.z, 1
};
glMultMatrixf(billboardmatrix);
float right = 8*FONTH, left = p->progress/100.0f*right;
glTranslatef(-right/2.0f, 0, 0);
float scale = FONTH*p->size/80.0f, right = 8, left = p->progress/100.0f*right;
matrix3x4 m(vec4(camright.x, -camup.x, -camdir.x, o.x),
vec4(camright.y, -camup.y, -camdir.y, o.y),
vec4(camright.z, -camup.z, -camdir.z, o.z));
m.scale(scale);
m.transformedtranslate(-right/2.0f, 0, 0);
if(outlinemeters)
{
glColor3f(0, 0.8f, 0);
glBegin(GL_TRIANGLE_STRIP);
varray::begin(GL_TRIANGLE_STRIP);
loopk(10)
{
const vec2 &sc = sincos360[k*(180/(10-1))];
float c = (0.5f + 0.1f)*sc.y, s = 0.5f - (0.5f + 0.1f)*sc.x;
glVertex2f(-c*FONTH, s*FONTH);
glVertex2f(right + c*FONTH, s*FONTH);
varray::attrib(m.transform(vec2(-c, s)));
varray::attrib(m.transform(vec2(right + c, s)));
}
glEnd();
varray::end();
}
if(basetype==PT_METERVS) glColor3ubv(p->color2);
else glColor3f(0, 0, 0);
glBegin(GL_TRIANGLE_STRIP);
varray::begin(GL_TRIANGLE_STRIP);
loopk(10)
{
const vec2 &sc = sincos360[k*(180/(10-1))];
float c = 0.5f*sc.y, s = 0.5f - 0.5f*sc.x;
glVertex2f(left + c*FONTH, s*FONTH);
glVertex2f(right + c*FONTH, s*FONTH);
varray::attrib(m.transform(vec2(left + c, s)));
varray::attrib(m.transform(vec2(right + c, s)));
}
glEnd();
varray::end();
if(outlinemeters)
{
glColor3f(0, 0.8f, 0);
glBegin(GL_TRIANGLE_FAN);
varray::begin(GL_TRIANGLE_FAN);
loopk(10)
{
const vec2 &sc = sincos360[k*(180/(10-1))];
float c = (0.5f + 0.1f)*sc.y, s = 0.5f - (0.5f + 0.1f)*sc.x;
glVertex2f(left + c*FONTH, s*FONTH);
varray::attrib(m.transform(vec2(left + c, s)));
}
glEnd();
varray::end();
}
glColor3ubv(color);
glBegin(GL_TRIANGLE_STRIP);
varray::begin(GL_TRIANGLE_STRIP);
loopk(10)
{
const vec2 &sc = sincos360[k*(180/(10-1))];
float c = 0.5f*sc.y, s = 0.5f - 0.5f*sc.x;
glVertex2f(-c*FONTH, s*FONTH);
glVertex2f(left + c*FONTH, s*FONTH);
varray::attrib(m.transform(vec2(-c, s)));
varray::attrib(m.transform(vec2(left + c, s)));
}
glEnd();
glPopMatrix();
varray::end();
}
};
static meterrenderer meters(PT_METER|PT_LERP), metervs(PT_METERVS|PT_LERP);

View File

@ -57,6 +57,10 @@ namespace varray
data.put((const uchar *)v, N*sizeof(T));
}
static inline void attrib(const vec &v) { attrib(v.x, v.y, v.z); }
static inline void attrib(const vec2 &v) { attrib(v.x, v.y); }
static inline void attrib(const vec4 &v) { attrib(v.x, v.y, v.z, v.w); }
extern int end();
extern void disable();

View File

@ -557,6 +557,8 @@ struct dualquat
}
};
struct glmatrix;
struct matrix3x3
{
vec a, b, c;
@ -575,6 +577,7 @@ struct matrix3x3
b = vec(txy + twz, 1 - (txx + tzz), tyz - twx);
c = vec(txz - twy, tyz + twx, 1 - (txx + tyy));
}
explicit matrix3x3(const glmatrix &m);
void mul(const matrix3x3 &m, const matrix3x3 &n)
{
@ -707,6 +710,8 @@ struct matrix3x3
b.rotate_around_z(ck, sk);
c.rotate_around_z(ck, sk);
}
vec transform(const vec2 &o) const { return vec(a.x*o.x + a.y*o.y, b.x*o.x + b.y*o.y, c.x*o.y + c.y*o.y); }
};
struct matrix3x4
@ -731,6 +736,7 @@ struct matrix3x4
c = vec4(xz - wy, yz + wx, rr.w + rr.z - rr.x - rr.y,
-(d.dual.w*r.z + d.dual.x*r.y - d.dual.y*r.x - d.dual.z*r.w));
}
explicit matrix3x4(const glmatrix &m);
void mul(float k)
{
@ -746,12 +752,13 @@ struct matrix3x4
c.mul3(k);
}
void translate(const vec &p)
void translate(float x, float y, float z)
{
a.w += p.x;
b.w += p.y;
c.w += p.z;
a.w += x;
b.w += y;
c.w += z;
}
void translate(const vec &p) { translate(p.x, p.y, p.z); }
void transformedtranslate(const vec &p, float scale = 1)
{
@ -760,6 +767,11 @@ struct matrix3x4
c.w += c.dot3(p)*scale;
}
void transformedtranslate(float x, float y, float z, float scale = 1)
{
transformedtranslate(vec(x, y, z), scale);
}
void accumulate(const matrix3x4 &m, float k)
{
a.add(vec4(m.a).mul(k));
@ -904,6 +916,7 @@ struct matrix3x4
a.y*o.x + b.y*o.y + c.y*o.z,
a.z*o.x + b.z*o.y + c.z*o.z);
}
vec transform(const vec2 &o) const { return vec(a.x*o.x + a.y*o.y + a.w, b.x*o.x + b.y*o.y + b.w, c.x*o.x + c.y*o.y + c.w); }
float getscale() const { return a.magnitude3(); }
vec gettranslation() const { return vec(a.w, b.w, c.w); }
@ -1486,6 +1499,14 @@ struct glmatrix
bool invert(const glmatrix &m, double mindet = 1.0e-10);
};
inline matrix3x3::matrix3x3(const glmatrix &m)
: a(m.a.x, m.b.x, m.c.x), b(m.a.y, m.b.y, m.c.y), c(m.a.z, m.b.z, m.c.z)
{}
inline matrix3x4::matrix3x4(const glmatrix &m)
: a(m.a.x, m.b.x, m.c.x, m.d.x), b(m.a.y, m.b.y, m.c.y, m.d.y), c(m.a.z, m.b.z, m.c.z, m.d.z)
{}
struct glmatrix3x3
{
vec a, b, c;