From 518f033b68649c151cc8725ea8c557eae01cc567 Mon Sep 17 00:00:00 2001 From: Alex Sakhartchouk Date: Thu, 5 Aug 2010 10:28:43 -0700 Subject: [PATCH] Adding more matrix math functions. Fixing build. Change-Id: Ie0f6724ba063ada94d1d44d99bbe56e21d9bd72f --- .../java/android/renderscript/Matrix2f.java | 5 + .../java/android/renderscript/Matrix3f.java | 9 ++ .../java/android/renderscript/Matrix4f.java | 9 ++ libs/rs/rsContext.cpp | 16 +-- libs/rs/scriptc/rs_core.rsh | 118 ++++++++++++++++++ 5 files changed, 149 insertions(+), 8 deletions(-) diff --git a/graphics/java/android/renderscript/Matrix2f.java b/graphics/java/android/renderscript/Matrix2f.java index a575ca9b816c9..99d23db860b6a 100644 --- a/graphics/java/android/renderscript/Matrix2f.java +++ b/graphics/java/android/renderscript/Matrix2f.java @@ -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; } diff --git a/graphics/java/android/renderscript/Matrix3f.java b/graphics/java/android/renderscript/Matrix3f.java index d01ac68d074d9..961bc5dd45a61 100644 --- a/graphics/java/android/renderscript/Matrix3f.java +++ b/graphics/java/android/renderscript/Matrix3f.java @@ -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; } diff --git a/graphics/java/android/renderscript/Matrix4f.java b/graphics/java/android/renderscript/Matrix4f.java index ebd5bdedfe683..e854cd9dd6b72 100644 --- a/graphics/java/android/renderscript/Matrix4f.java +++ b/graphics/java/android/renderscript/Matrix4f.java @@ -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; } diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 1c0395446aa32..681f83e7618a1 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 463550f8c3a2d..01b039f6dee10 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 /////////////////////////////////////////////////////