Adding more matrix math functions.

Fixing build.

Change-Id: Ie0f6724ba063ada94d1d44d99bbe56e21d9bd72f
This commit is contained in:
Alex Sakhartchouk
2010-08-05 10:28:43 -07:00
parent 442a647424
commit 518f033b68
5 changed files with 149 additions and 8 deletions

View File

@@ -96,6 +96,11 @@ public class Matrix2f {
tmp.loadScale(x, y);
multiply(tmp);
}
public void transpose() {
float temp = mMat[1];
mMat[1] = mMat[2];
mMat[2] = temp;
}
final float[] mMat;
}

View File

@@ -165,6 +165,15 @@ public class Matrix3f {
tmp.loadTranslate(x, y);
multiply(tmp);
}
public void transpose() {
for(int i = 0; i < 2; ++i) {
for(int j = i + 1; j < 3; ++j) {
float temp = mMat[i*3 + j];
mMat[i*3 + j] = mMat[j*3 + i];
mMat[j*3 + i] = temp;
}
}
}
final float[] mMat;
}

View File

@@ -179,6 +179,15 @@ public class Matrix4f {
tmp.loadTranslate(x, y, z);
multiply(tmp);
}
public void transpose() {
for(int i = 0; i < 3; ++i) {
for(int j = i + 1; j < 4; ++j) {
float temp = mMat[i*4 + j];
mMat[i*4 + j] = mMat[j*4 + i];
mMat[j*4 + i] = temp;
}
}
}
final float[] mMat;
}

View File

@@ -263,38 +263,38 @@ void Context::displayDebugStats()
{
char buffer[128];
sprintf(buffer, "Frame %i ms, Script %i ms", mTimeMSLastFrame, mTimeMSLastScript);
float oldR = mStateVertex.color[0];
/*float oldR = mStateVertex.color[0];
float oldG = mStateVertex.color[1];
float oldB = mStateVertex.color[2];
float oldA = mStateVertex.color[3];
float oldA = mStateVertex.color[3];*/
float shadowCol = 0.2f;
mStateVertex.color[0] = shadowCol;
/*mStateVertex.color[0] = shadowCol;
mStateVertex.color[1] = shadowCol;
mStateVertex.color[2] = shadowCol;
mStateVertex.color[3] = 1.0f;
if (!checkVersion2_0()) {
glColor4f(shadowCol, shadowCol, shadowCol, 1.0f);
}
}*/
mStateFont.renderText(buffer, 5, getHeight() - 5);
float textCol = 0.9f;
/*float textCol = 0.9f;
mStateVertex.color[0] = textCol;
mStateVertex.color[1] = textCol;
mStateVertex.color[2] = textCol;
mStateVertex.color[3] = 1.0f;
if (!checkVersion2_0()) {
glColor4f(textCol, textCol, textCol, 1.0f);
}
}*/
mStateFont.renderText(buffer, 4, getHeight() - 6);
mStateVertex.color[0] = oldR;
/*mStateVertex.color[0] = oldR;
mStateVertex.color[1] = oldG;
mStateVertex.color[2] = oldB;
mStateVertex.color[3] = oldA;
if (!checkVersion2_0()) {
glColor4f(oldR, oldG, oldB, oldA);
}
}*/
}
void * Context::threadProc(void *vrsc)

View File

@@ -476,6 +476,124 @@ rsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
return ret;
}
// Returns true if the matrix was successfully inversed
static bool __attribute__((overloadable))
rsMatrixInverse(rs_matrix4x4 *m) {
rs_matrix4x4 result;
int i, j;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
// computeCofactor for int i, int j
int c0 = (i+1) % 4;
int c1 = (i+2) % 4;
int c2 = (i+3) % 4;
int r0 = (j+1) % 4;
int r1 = (j+2) % 4;
int r2 = (j+3) % 4;
float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1]))
- (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0]))
+ (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0]));
float cofactor = (i+j) & 1 ? -minor : minor;
result.m[4*i + j] = cofactor;
}
}
// Dot product of 0th column of source and 0th row of result
float det = m->m[0]*result.m[0] + m->m[4]*result.m[1] +
m->m[8]*result.m[2] + m->m[12]*result.m[3];
if (fabs(det) < 1e-6) {
return false;
}
det = 1.0f / det;
for (i = 0; i < 16; ++i) {
m->m[i] = result.m[i] * det;
}
return true;
}
// Returns true if the matrix was successfully inversed
static bool __attribute__((overloadable))
rsMatrixInverseTranspose(rs_matrix4x4 *m) {
rs_matrix4x4 result;
int i, j;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
// computeCofactor for int i, int j
int c0 = (i+1) % 4;
int c1 = (i+2) % 4;
int c2 = (i+3) % 4;
int r0 = (j+1) % 4;
int r1 = (j+2) % 4;
int r2 = (j+3) % 4;
float minor = (m->m[c0 + 4*r0] * (m->m[c1 + 4*r1] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r1]))
- (m->m[c0 + 4*r1] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r2] - m->m[c1 + 4*r2] * m->m[c2 + 4*r0]))
+ (m->m[c0 + 4*r2] * (m->m[c1 + 4*r0] * m->m[c2 + 4*r1] - m->m[c1 + 4*r1] * m->m[c2 + 4*r0]));
float cofactor = (i+j) & 1 ? -minor : minor;
result.m[4*j + i] = cofactor;
}
}
// Dot product of 0th column of source and 0th column of result
float det = m->m[0]*result.m[0] + m->m[4]*result.m[4] +
m->m[8]*result.m[8] + m->m[12]*result.m[12];
if (fabs(det) < 1e-6) {
return false;
}
det = 1.0f / det;
for (i = 0; i < 16; ++i) {
m->m[i] = result.m[i] * det;
}
return true;
}
static void __attribute__((overloadable))
rsMatrixTranspose(rs_matrix4x4 *m) {
int i, j;
float temp;
for (i = 0; i < 3; ++i) {
for (j = i + 1; j < 4; ++j) {
temp = m->m[i*4 + j];
m->m[i*4 + j] = m->m[j*4 + i];
m->m[j*4 + i] = temp;
}
}
}
static void __attribute__((overloadable))
rsMatrixTranspose(rs_matrix3x3 *m) {
int i, j;
float temp;
for (i = 0; i < 2; ++i) {
for (j = i + 1; j < 3; ++j) {
temp = m->m[i*3 + j];
m->m[i*3 + j] = m->m[j*4 + i];
m->m[j*3 + i] = temp;
}
}
}
static void __attribute__((overloadable))
rsMatrixTranspose(rs_matrix2x2 *m) {
float temp = m->m[1];
m->m[1] = m->m[2];
m->m[2] = temp;
}
/////////////////////////////////////////////////////
// int ops
/////////////////////////////////////////////////////