From 518f033b68649c151cc8725ea8c557eae01cc567 Mon Sep 17 00:00:00 2001 From: Alex Sakhartchouk Date: Thu, 5 Aug 2010 10:28:43 -0700 Subject: Adding more matrix math functions. Fixing build. Change-Id: Ie0f6724ba063ada94d1d44d99bbe56e21d9bd72f --- libs/rs/rsContext.cpp | 16 +++--- libs/rs/scriptc/rs_core.rsh | 118 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 8 deletions(-) (limited to 'libs/rs') diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 1c03954..681f83e 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -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) diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh index 463550f..01b039f 100644 --- a/libs/rs/scriptc/rs_core.rsh +++ b/libs/rs/scriptc/rs_core.rsh @@ -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 ///////////////////////////////////////////////////// -- cgit v1.1