more matrix cleanups
parent
2114cc7928
commit
76b5ca993e
|
@ -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);
|
||||
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);
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
glVertex3f(1, 1, 0);
|
||||
glVertex3f(-1, 1, 0);
|
||||
glVertex3f(0, 0, 0);
|
||||
glEnd();
|
||||
glPopMatrix();
|
||||
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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue