void matsup_MultiplyMat4f(const float* a, const float* b, float* mout) { #ifdef USE_VFP Matrix4Mul(a, b, mout); #else mout[0] = a[0] * b[0] + a[4] * b[1] + a[8] * b[2] + a[12] * b[3]; mout[1] = a[1] * b[0] + a[5] * b[1] + a[9] * b[2] + a[13] * b[3]; mout[2] = a[2] * b[0] + a[6] * b[1] + a[10] * b[2] + a[14] * b[3]; mout[3] = a[3] * b[0] + a[7] * b[1] + a[11] * b[2] + a[15] * b[3]; mout[4] = a[0] * b[4] + a[4] * b[5] + a[8] * b[6] + a[12] * b[7]; mout[5] = a[1] * b[4] + a[5] * b[5] + a[9] * b[6] + a[13] * b[7]; mout[6] = a[2] * b[4] + a[6] * b[5] + a[10] * b[6] + a[14] * b[7]; mout[7] = a[3] * b[4] + a[7] * b[5] + a[11] * b[6] + a[15] * b[7]; mout[8] = a[0] * b[8] + a[4] * b[9] + a[8] * b[10] + a[12] * b[11]; mout[9] = a[1] * b[8] + a[5] * b[9] + a[9] * b[10] + a[13] * b[11]; mout[10] = a[2] * b[8] + a[6] * b[9] + a[10] * b[10] + a[14] * b[11]; mout[11] = a[3] * b[8] + a[7] * b[9] + a[11] * b[10] + a[15] * b[11]; mout[12] = a[0] * b[12] + a[4] * b[13] + a[8] * b[14] + a[12] * b[15]; mout[13] = a[1] * b[12] + a[5] * b[13] + a[9] * b[14] + a[13] * b[15]; mout[14] = a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15]; mout[15] = a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15]; #endif }
//---------------------------------------------------------------------------------------------- void MaterialEffect::Affect() /*const*/ { #ifndef D3DX_API GLuint program = GetNode()->GetShaderProgram(); float WVMat[16] = {0.f}, WVPMat[16] = {0.f}; Matrix4Mul(WVMat, m_pD3DInterface->m_world, m_pD3DInterface->m_view); Matrix4Mul(WVPMat, WVMat, m_pD3DInterface->m_proj); GLint modelViewProjectionMatrixLocation = glGetUniformLocation(program, "mVPMat"); if (modelViewProjectionMatrixLocation != -1){ glUniformMatrix4fv(modelViewProjectionMatrixLocation, 1, GL_TRUE, WVPMat); } GLint modelViewMatrixLocation = glGetUniformLocation(program, "mVMat"); if (modelViewMatrixLocation != -1){ glUniformMatrix4fv(modelViewMatrixLocation, 1, GL_TRUE, WVMat); } SetSampleTextureID(0, DiffuseMap); bool bFog = m_pD3DInterface->m_bFog && fog; GLint InFog = glGetUniformLocation(program, "bFog"); if (InFog != -1){ glUniform1i(InFog, bFog); } GLuint InFogColor = glGetUniformLocation(program, "fogColor"); if (InFogColor != -1) { byte a = (m_pD3DInterface->m_FogColor & 0xFF000000) >> 24; byte r = (m_pD3DInterface->m_FogColor & 0x00FF0000) >> 16; byte g = (m_pD3DInterface->m_FogColor & 0x0000FF00) >> 8; byte b = (m_pD3DInterface->m_FogColor & 0x000000FF); glUniform4f(InFogColor, r / 255.f, g / 255.f, b / 255.f, a / 255.f); }
void MatrixMultiply( MATRIX &mOut, const MATRIX &mA, const MATRIX &mB) { #if (TARGET_IPHONE_SIMULATOR == 0) && (TARGET_OS_IPHONE == 1) #ifdef _ARM_ARCH_7 NEON_Matrix4Mul( mA.f, mB.f, mOut.f ); #else Matrix4Mul(mA.f, mB.f, mOut.f); #endif #else MATRIX mRet; // Perform calculation on a dummy matrix (mRet) mRet.f[ 0] = mA.f[ 0]*mB.f[ 0] + mA.f[ 1]*mB.f[ 4] + mA.f[ 2]*mB.f[ 8] + mA.f[ 3]*mB.f[12]; mRet.f[ 1] = mA.f[ 0]*mB.f[ 1] + mA.f[ 1]*mB.f[ 5] + mA.f[ 2]*mB.f[ 9] + mA.f[ 3]*mB.f[13]; mRet.f[ 2] = mA.f[ 0]*mB.f[ 2] + mA.f[ 1]*mB.f[ 6] + mA.f[ 2]*mB.f[10] + mA.f[ 3]*mB.f[14]; mRet.f[ 3] = mA.f[ 0]*mB.f[ 3] + mA.f[ 1]*mB.f[ 7] + mA.f[ 2]*mB.f[11] + mA.f[ 3]*mB.f[15]; mRet.f[ 4] = mA.f[ 4]*mB.f[ 0] + mA.f[ 5]*mB.f[ 4] + mA.f[ 6]*mB.f[ 8] + mA.f[ 7]*mB.f[12]; mRet.f[ 5] = mA.f[ 4]*mB.f[ 1] + mA.f[ 5]*mB.f[ 5] + mA.f[ 6]*mB.f[ 9] + mA.f[ 7]*mB.f[13]; mRet.f[ 6] = mA.f[ 4]*mB.f[ 2] + mA.f[ 5]*mB.f[ 6] + mA.f[ 6]*mB.f[10] + mA.f[ 7]*mB.f[14]; mRet.f[ 7] = mA.f[ 4]*mB.f[ 3] + mA.f[ 5]*mB.f[ 7] + mA.f[ 6]*mB.f[11] + mA.f[ 7]*mB.f[15]; mRet.f[ 8] = mA.f[ 8]*mB.f[ 0] + mA.f[ 9]*mB.f[ 4] + mA.f[10]*mB.f[ 8] + mA.f[11]*mB.f[12]; mRet.f[ 9] = mA.f[ 8]*mB.f[ 1] + mA.f[ 9]*mB.f[ 5] + mA.f[10]*mB.f[ 9] + mA.f[11]*mB.f[13]; mRet.f[10] = mA.f[ 8]*mB.f[ 2] + mA.f[ 9]*mB.f[ 6] + mA.f[10]*mB.f[10] + mA.f[11]*mB.f[14]; mRet.f[11] = mA.f[ 8]*mB.f[ 3] + mA.f[ 9]*mB.f[ 7] + mA.f[10]*mB.f[11] + mA.f[11]*mB.f[15]; mRet.f[12] = mA.f[12]*mB.f[ 0] + mA.f[13]*mB.f[ 4] + mA.f[14]*mB.f[ 8] + mA.f[15]*mB.f[12]; mRet.f[13] = mA.f[12]*mB.f[ 1] + mA.f[13]*mB.f[ 5] + mA.f[14]*mB.f[ 9] + mA.f[15]*mB.f[13]; mRet.f[14] = mA.f[12]*mB.f[ 2] + mA.f[13]*mB.f[ 6] + mA.f[14]*mB.f[10] + mA.f[15]*mB.f[14]; mRet.f[15] = mA.f[12]*mB.f[ 3] + mA.f[13]*mB.f[ 7] + mA.f[14]*mB.f[11] + mA.f[15]*mB.f[15]; // Copy result in pResultMatrix mOut = mRet; #endif }
//---------------------------------------------------------------------------------------------- void MaterialEffectUI::Affect() { GLuint program = GetNode()->GetShaderProgram(); float WVMat[16] = {0.f}, WVPMat[16] = {0.f}, UVMat[16] = { m_pDiffuseMap->GetUL(), 0.f, 0.f, 0.f, 0.f, m_pDiffuseMap->GetVL(), 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, 1.f}; Matrix4Mul(WVMat, m_pD3DInterface->m_world, m_pD3DInterface->m_view); Matrix4Mul(WVPMat, WVMat, m_pD3DInterface->m_proj); GLint modelViewProjectionMatrixLocation = glGetUniformLocation(program, "mVPMat"); if (modelViewProjectionMatrixLocation != -1){ glUniformMatrix4fv(modelViewProjectionMatrixLocation, 1, GL_TRUE, WVPMat); } GLint modelViewMatrixLocation = glGetUniformLocation(program, "mVMat"); if (modelViewMatrixLocation != -1){ glUniformMatrix4fv(modelViewMatrixLocation, 1, GL_TRUE, WVMat); } GLint modelUVMatrixLocation = glGetUniformLocation(program, "mUVMat"); if (modelUVMatrixLocation != -1){ glUniformMatrix4fv(modelUVMatrixLocation, 1, GL_TRUE, UVMat); } GLint modelUVOffsetLocation = glGetUniformLocation(program, "UVOffset"); if (modelUVOffsetLocation != -1){ glUniform2f(modelUVOffsetLocation, m_pDiffuseMap->GetU(), m_pDiffuseMap->GetV()); } if (m_pRT == nullptr) { SetSampleTextureID(0, m_pDiffuseMap); } else { glActiveTexture(GL_TEXTURE0 + 0); glBindTexture(GL_TEXTURE_2D, m_pRT->GetTexture()); } bool bFog = m_pD3DInterface->m_bFog && fog; GLint InFog = glGetUniformLocation(program, "bFog"); if (InFog != -1){ glUniform1i(InFog, bFog); } GLint InFogColor = glGetUniformLocation(program, "fogColor"); if (InFogColor != -1) { byte a = (m_pD3DInterface->m_FogColor & 0xFF000000) >> 24; byte r = (m_pD3DInterface->m_FogColor & 0x00FF0000) >> 16; byte g = (m_pD3DInterface->m_FogColor & 0x0000FF00) >> 8; byte b = (m_pD3DInterface->m_FogColor & 0x000000FF); glUniform4f(InFogColor, r / 255.f, g / 255.f, b / 255.f, a / 255.f); }