From 5867b9679e8f3b141790f5814029f546a2495f94 Mon Sep 17 00:00:00 2001 From: linshier Date: Thu, 23 Sep 2010 05:11:05 +0000 Subject: [PATCH] Additional fix for issue 460. Tested on Linux. --- JGE/src/pc/JGfx.cpp | 61 +++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/JGE/src/pc/JGfx.cpp b/JGE/src/pc/JGfx.cpp index 475ca88ec..3ce26c8cd 100644 --- a/JGE/src/pc/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -455,6 +455,34 @@ void esMatrixMultiply(ESMatrix *result, ESMatrix *srcA, ESMatrix *srcB) (srcA->m[i][2] * srcB->m[2][3]) + (srcA->m[i][3] * srcB->m[3][3]) ; } +/* + * Actually, srcA and srcB are column-major order matrixes, while they + * use row-major multiplication. Then above result equals to (B * A) likes these: + + for (i=0; i<4; i++){ + tmp.m[0][i] = (srcB->m[0][i] * srcA->m[0][0]) + + (srcB->m[1][i] * srcA->m[0][1]) + + (srcB->m[2][i] * srcA->m[0][2]) + + (srcB->m[3][i] * srcA->m[0][3]) ; + + tmp.m[1][i] = (srcB->m[0][i] * srcA->m[1][0]) + + (srcB->m[1][i] * srcA->m[1][1]) + + (srcB->m[2][i] * srcA->m[1][2]) + + (srcB->m[3][i] * srcA->m[1][3]) ; + + tmp.m[2][i] = (srcB->m[0][i] * srcA->m[2][0]) + + (srcB->m[1][i] * srcA->m[2][1]) + + (srcB->m[2][i] * srcA->m[2][2]) + + (srcB->m[3][i] * srcA->m[2][3]) ; + + tmp.m[3][i] = (srcB->m[0][i] * srcA->m[3][0]) + + (srcB->m[1][i] * srcA->m[3][1]) + + (srcB->m[2][i] * srcA->m[3][2]) + + (srcB->m[3][i] * srcA->m[3][3]) ; + } + + * So, it works. (Refer to math method of Homogeneous Coordinate) + */ memcpy(result, &tmp, sizeof(ESMatrix)); } @@ -486,24 +514,26 @@ void esRotate(ESMatrix *result, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) zs = z * sinAngle; oneMinusCos = 1.0f - cosAngle; + // Note: matrixes in OpenGL ES are stored in column-major order! + rotMat.m[0][0] = (oneMinusCos * xx) + cosAngle; - rotMat.m[0][1] = (oneMinusCos * xy) - zs; - rotMat.m[0][2] = (oneMinusCos * zx) + ys; - rotMat.m[0][3] = 0.0F; - - rotMat.m[1][0] = (oneMinusCos * xy) + zs; - rotMat.m[1][1] = (oneMinusCos * yy) + cosAngle; - rotMat.m[1][2] = (oneMinusCos * yz) - xs; - rotMat.m[1][3] = 0.0F; - - rotMat.m[2][0] = (oneMinusCos * zx) - ys; - rotMat.m[2][1] = (oneMinusCos * yz) + xs; - rotMat.m[2][2] = (oneMinusCos * zz) + cosAngle; - rotMat.m[2][3] = 0.0F; - + rotMat.m[1][0] = (oneMinusCos * xy) - zs; + rotMat.m[2][0] = (oneMinusCos * zx) + ys; rotMat.m[3][0] = 0.0F; + + rotMat.m[0][1] = (oneMinusCos * xy) + zs; + rotMat.m[1][1] = (oneMinusCos * yy) + cosAngle; + rotMat.m[2][1] = (oneMinusCos * yz) - xs; rotMat.m[3][1] = 0.0F; + + rotMat.m[0][2] = (oneMinusCos * zx) - ys; + rotMat.m[1][2] = (oneMinusCos * yz) + xs; + rotMat.m[2][2] = (oneMinusCos * zz) + cosAngle; rotMat.m[3][2] = 0.0F; + + rotMat.m[0][3] = 0.0F; + rotMat.m[1][3] = 0.0F; + rotMat.m[2][3] = 0.0F; rotMat.m[3][3] = 1.0F; esMatrixMultiply( result, &rotMat, result ); @@ -869,8 +899,7 @@ void JRenderer::RenderQuad(JQuad* quad, float xo, float yo, float angle, float x esTranslate(&mvpMatrix, xo, yo, 0.0f); // see http://code.google.com/p/wagic/issues/detail?id=460 - // in openGL1, we rotate with -angle, but here we use +angle. Why ? - esRotate(&mvpMatrix, angle*RAD2DEG, 0.0f, 0.0f, 1.0f); + esRotate(&mvpMatrix, -angle*RAD2DEG, 0.0f, 0.0f, 1.0f); esScale(&mvpMatrix, xScale, yScale, 1.0f);