Exemple #1
0
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);
	}
Exemple #3
0
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);
	}