Ejemplo n.º 1
0
void FP_SingleColour::process(const FragmentProcessorInput* input, FragmentProcessorOutput* output) const
{
	const PROCDATA_SINGLECOLOUR* inData = (const PROCDATA_SINGLECOLOUR*)input->user;

	float shadowFactor = PuresoftSamplerProjection::get(m_shadowTex, inData->shadowcoord);

	ALIGN16 float L[4];
	mcemaths_sub_3_4(L, m_lightPos, inData->worldPos);
	mcemaths_norm_3_4(L);

	ALIGN16 float E[4];
	mcemaths_sub_3_4(E, m_cameraPos, inData->worldPos);
	mcemaths_norm_3_4(E);

	ALIGN16 float H[4];
	mcemaths_add_3_4(H, E, L);
	mcemaths_norm_3_4(H);


	enum {LAMBERT, SPECULAR};
	ALIGN16 float factors[4];

	factors[LAMBERT] = mcemaths_dot_3_4(L, inData->normal);

	float yawOfLight = (float)acos(mcemaths_dot_3_4(L, m_lightDir));
	factors[LAMBERT] *= yawOfLight < fieldOfLight ? 1.0f : (float)opt_pow(cos(yawOfLight - fieldOfLight), 150);

	factors[SPECULAR] = opt_pow(mcemaths_dot_3_4(H, inData->normal), (unsigned int)*m_specularExponent);

	mcemaths_clamp_3_4(factors, 0, 1.0f);

	ALIGN16 float outputColour[4];
	mcemaths_quatcpy(outputColour, m_diffuse);
	mcemaths_mul_3_4(outputColour, factors[LAMBERT]);

	ALIGN16 float specularColour[4];
	mcemaths_quatcpy(specularColour, m_diffuse);
	mcemaths_mulvec_3_4(specularColour, m_specularColour);
	mcemaths_mul_3_4(specularColour, factors[SPECULAR]);

	ALIGN16 float ambientColour[4];
	mcemaths_quatcpy(ambientColour, m_diffuse);
	mcemaths_mulvec_3_4(ambientColour, m_ambient);

	mcemaths_add_3_4_ip(outputColour, specularColour);
	mcemaths_mul_3_4(outputColour, shadowFactor);
	mcemaths_add_3_4_ip(outputColour, ambientColour);
	mcemaths_clamp_3_4(outputColour, 0, 1.0f);

	mcemaths_mul_3_4(outputColour, 255.0f);

	PURESOFTBGRA bytesColour;
	bytesColour.elems.r = (unsigned char)outputColour[2];
	bytesColour.elems.g = (unsigned char)outputColour[1];
	bytesColour.elems.b = (unsigned char)outputColour[0];
	bytesColour.elems.a = 0;

	output->write4(0, &bytesColour);
}
Ejemplo n.º 2
0
void IP_CloudShadow::interpolateByContributes(void* interpolatedUserData, const void** vertexUserData, const float* correctedContributes) const
{
	__declspec(align(16)) PROCDATA_CLOUDSHADOW temp[3];
	copyUserData(temp,     (PROCDATA_CLOUDSHADOW*)vertexUserData[0]);
	copyUserData(temp + 1, (PROCDATA_CLOUDSHADOW*)vertexUserData[1]);
	copyUserData(temp + 2, (PROCDATA_CLOUDSHADOW*)vertexUserData[2]);

	mcemaths_mul_3_4(temp[0].texcoord, correctedContributes[0]);
	mcemaths_mul_3_4(temp[1].texcoord, correctedContributes[1]);
	mcemaths_mul_3_4(temp[2].texcoord, correctedContributes[2]);

	PROCDATA_CLOUDSHADOW* output = (PROCDATA_CLOUDSHADOW*)interpolatedUserData;

	mcemaths_quatcpy(output->texcoord, temp[0].texcoord);
	mcemaths_add_3_4_ip(output->texcoord, temp[1].texcoord);
	mcemaths_add_3_4_ip(output->texcoord, temp[2].texcoord);
}
Ejemplo n.º 3
0
void IP_SingleColour::stepForward(void* interpolatedUserDataStart, const void* interpolatedUserDataStep, int stepCount) const
{
	PROCDATA_SINGLECOLOUR* start = (PROCDATA_SINGLECOLOUR*)interpolatedUserDataStart;
	const PROCDATA_SINGLECOLOUR* step = (PROCDATA_SINGLECOLOUR*)interpolatedUserDataStep;

	if(1 == stepCount)
	{
		mcemaths_add_3_4_ip(start->normal, step->normal);
		mcemaths_add_3_4_ip(start->worldPos, step->worldPos);
		mcemaths_add_3_4_ip(start->shadowcoord, step->shadowcoord);
	}
	else
	{
		mcemaths_step_3_4_ip(start->normal, step->normal, (float)stepCount);
		mcemaths_step_3_4_ip(start->worldPos, step->worldPos, (float)stepCount);
		mcemaths_step_3_4_ip(start->shadowcoord, step->shadowcoord, (float)stepCount);
	}
}
Ejemplo n.º 4
0
void IP_DiffuseOnly::stepForward(void* interpolatedUserDataStart, const void* interpolatedUserDataStep, int stepCount) const
{
	PROCDATA_DIFFUSEONLY* start = (PROCDATA_DIFFUSEONLY*)interpolatedUserDataStart;
	const PROCDATA_DIFFUSEONLY* step = (PROCDATA_DIFFUSEONLY*)interpolatedUserDataStep;

	if(1 == stepCount)
	{
		mcemaths_add_3_4_ip(start->normal, step->normal);
		mcemaths_add_3_4_ip(start->worldPos, step->worldPos);
		mcemaths_add_3_4_ip(start->texcoord, step->texcoord);
		mcemaths_add_3_4_ip(start->shadowcoord, step->shadowcoord);
	}
	else
	{
		mcemaths_step_3_4_ip(start->normal, step->normal, (float)stepCount);
		mcemaths_step_3_4_ip(start->worldPos, step->worldPos, (float)stepCount);
		mcemaths_step_3_4_ip(start->texcoord, step->texcoord, (float)stepCount);
		mcemaths_step_3_4_ip(start->shadowcoord, step->shadowcoord, (float)stepCount);
	}
}
Ejemplo n.º 5
0
void FP_DiffuseOnly::process(const FragmentProcessorInput* input, FragmentProcessorOutput* output) const
{
	PURESOFTBGRA bytesColour;
	ALIGN16 float outputColour[4], ambiemtColour[4];

	const PROCDATA_DIFFUSEONLY* inData = (const PROCDATA_DIFFUSEONLY*)input->user;

	float shadowFactor = PuresoftSamplerProjection::get(m_shadowTex, inData->shadowcoord);

	PuresoftSampler2D::get4(m_diffuseTex, inData->texcoord[0], inData->texcoord[1], &bytesColour);
	outputColour[0] = bytesColour.elems.b;
	outputColour[1] = bytesColour.elems.g;
	outputColour[2] = bytesColour.elems.r;
	outputColour[3] = bytesColour.elems.a;

	mcemaths_quatcpy(ambiemtColour, outputColour);
	mcemaths_mulvec_3_4(ambiemtColour, m_ambient);

	ALIGN16 float L[4];
	mcemaths_sub_3_4(L, m_lightPos, inData->worldPos);
	mcemaths_norm_3_4(L);

	ALIGN16 float E[4];
	mcemaths_sub_3_4(E, m_cameraPos, inData->worldPos);
	mcemaths_norm_3_4(E);

	ALIGN16 float H[4];
	mcemaths_add_3_4(H, E, L);
	mcemaths_norm_3_4(H);

	enum {LAMBERT, SPECULAR};
	ALIGN16 float factors[4];

	factors[LAMBERT] = mcemaths_dot_3_4(L, inData->normal);

	float yawOfLight = acos(mcemaths_dot_3_4(L, m_lightDir));
	factors[LAMBERT] *= yawOfLight < fieldOfLight ? 1.0f : opt_pow(cos(yawOfLight - fieldOfLight), 150);

	factors[SPECULAR] = opt_pow(mcemaths_dot_3_4(H, inData->normal), (unsigned int)*m_specularExponent);

	mcemaths_clamp_3_4(factors, 0, 1.0f);

	mcemaths_mul_3_4(outputColour, (factors[LAMBERT] + factors[SPECULAR]) * shadowFactor);
	mcemaths_add_3_4_ip(outputColour, ambiemtColour);
	mcemaths_clamp_3_4(outputColour, 0, 255.0f);

	bytesColour.elems.r = (unsigned char)outputColour[2];
	bytesColour.elems.g = (unsigned char)outputColour[1];
	bytesColour.elems.b = (unsigned char)outputColour[0];
	bytesColour.elems.a = 0;

	output->write4(0, &bytesColour);
}
Ejemplo n.º 6
0
void IP_Planet::stepForward(void* interpolatedUserDataStart, const void* interpolatedUserDataStep, int stepCount) const
{
	PROCDATA_PLANET* start = (PROCDATA_PLANET*)interpolatedUserDataStart;
	const PROCDATA_PLANET* step = (PROCDATA_PLANET*)interpolatedUserDataStep;

	if(1 == stepCount)
	{
		mcemaths_add_3_4_ip(start->tangent, step->normal);
		mcemaths_add_3_4_ip(start->binormal, step->normal);
		mcemaths_add_3_4_ip(start->normal, step->normal);
		mcemaths_add_3_4_ip(start->worldPos, step->worldPos);
		mcemaths_add_3_4_ip(start->texcoord, step->texcoord);
		mcemaths_add_3_4_ip(start->shadowcoord, step->shadowcoord);
	}
	else
	{
		mcemaths_step_3_4_ip(start->tangent, step->normal, (float)stepCount);
		mcemaths_step_3_4_ip(start->binormal, step->normal, (float)stepCount);
		mcemaths_step_3_4_ip(start->normal, step->normal, (float)stepCount);
		mcemaths_step_3_4_ip(start->worldPos, step->worldPos, (float)stepCount);
		mcemaths_step_3_4_ip(start->texcoord, step->texcoord, (float)stepCount);
		mcemaths_step_3_4_ip(start->shadowcoord, step->shadowcoord, (float)stepCount);
	}

}
Ejemplo n.º 7
0
void IP_SingleColour::interpolateByContributes(void* interpolatedUserData, const void** vertexUserData, const float* correctedContributes) const
{
	__declspec(align(16)) PROCDATA_SINGLECOLOUR temp[3];
	copyUserDataSingleColour(temp,     (PROCDATA_SINGLECOLOUR*)vertexUserData[0]);
	copyUserDataSingleColour(temp + 1, (PROCDATA_SINGLECOLOUR*)vertexUserData[1]);
	copyUserDataSingleColour(temp + 2, (PROCDATA_SINGLECOLOUR*)vertexUserData[2]);

	mcemaths_mul_3_4(temp[0].normal, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].worldPos, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].shadowcoord, correctedContributes[0]);

	mcemaths_mul_3_4(temp[1].normal, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].worldPos, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].shadowcoord, correctedContributes[1]);

	mcemaths_mul_3_4(temp[2].normal, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].worldPos, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].shadowcoord, correctedContributes[2]);

	PROCDATA_SINGLECOLOUR* output = (PROCDATA_SINGLECOLOUR*)interpolatedUserData;

	mcemaths_quatcpy(output->normal, temp[0].normal);
	mcemaths_quatcpy(output->worldPos, temp[0].worldPos);
	mcemaths_quatcpy(output->shadowcoord, temp[0].shadowcoord);

	mcemaths_add_3_4_ip(output->normal, temp[1].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[1].worldPos);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[1].shadowcoord);

	mcemaths_add_3_4_ip(output->normal, temp[2].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[2].worldPos);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[2].shadowcoord);
}
Ejemplo n.º 8
0
void IP_CloudShadow::stepForward(void* interpolatedUserDataStart, const void* interpolatedUserDataStep, int stepCount) const
{
	PROCDATA_CLOUDSHADOW* start = (PROCDATA_CLOUDSHADOW*)interpolatedUserDataStart;
	const PROCDATA_CLOUDSHADOW* step = (PROCDATA_CLOUDSHADOW*)interpolatedUserDataStep;

	if(1 == stepCount)
	{
		mcemaths_add_3_4_ip(start->texcoord, step->texcoord);
	}
	else
	{
		mcemaths_step_3_4_ip(start->texcoord, step->texcoord, (float)stepCount);
	}
}
Ejemplo n.º 9
0
void IP_DiffuseOnly::interpolateByContributes(void* interpolatedUserData, const void** vertexUserData, const float* correctedContributes) const
{
	__declspec(align(16)) PROCDATA_DIFFUSEONLY temp[3];
	copyUserDataDiffuseOnly(temp,     (PROCDATA_DIFFUSEONLY*)vertexUserData[0]);
	copyUserDataDiffuseOnly(temp + 1, (PROCDATA_DIFFUSEONLY*)vertexUserData[1]);
	copyUserDataDiffuseOnly(temp + 2, (PROCDATA_DIFFUSEONLY*)vertexUserData[2]);

	mcemaths_mul_3_4(temp[0].normal, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].worldPos, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].texcoord, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].shadowcoord, correctedContributes[0]);

	mcemaths_mul_3_4(temp[1].normal, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].worldPos, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].texcoord, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].shadowcoord, correctedContributes[1]);

	mcemaths_mul_3_4(temp[2].normal, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].worldPos, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].texcoord, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].shadowcoord, correctedContributes[2]);

	PROCDATA_DIFFUSEONLY* output = (PROCDATA_DIFFUSEONLY*)interpolatedUserData;

	mcemaths_quatcpy(output->normal, temp[0].normal);
	mcemaths_quatcpy(output->worldPos, temp[0].worldPos);
	mcemaths_quatcpy(output->texcoord, temp[0].texcoord);
	mcemaths_quatcpy(output->shadowcoord, temp[0].shadowcoord);

	mcemaths_add_3_4_ip(output->normal, temp[1].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[1].worldPos);
	mcemaths_add_3_4_ip(output->texcoord, temp[1].texcoord);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[1].shadowcoord);

	mcemaths_add_3_4_ip(output->normal, temp[2].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[2].worldPos);
	mcemaths_add_3_4_ip(output->texcoord, temp[2].texcoord);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[2].shadowcoord);
}
Ejemplo n.º 10
0
void IP_Planet::interpolateByContributes(void* interpolatedUserData, const void** vertexUserData, const float* correctedContributes) const
{
	__declspec(align(16)) PROCDATA_PLANET temp[3];
	copyUserData(temp,     (PROCDATA_PLANET*)vertexUserData[0]);
	copyUserData(temp + 1, (PROCDATA_PLANET*)vertexUserData[1]);
	copyUserData(temp + 2, (PROCDATA_PLANET*)vertexUserData[2]);

	mcemaths_mul_3_4(temp[0].tangent, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].binormal, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].normal, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].worldPos, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].texcoord, correctedContributes[0]);
	mcemaths_mul_3_4(temp[0].shadowcoord, correctedContributes[0]);

	mcemaths_mul_3_4(temp[1].tangent, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].binormal, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].normal, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].worldPos, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].texcoord, correctedContributes[1]);
	mcemaths_mul_3_4(temp[1].shadowcoord, correctedContributes[1]);

	mcemaths_mul_3_4(temp[2].tangent, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].binormal, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].normal, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].worldPos, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].texcoord, correctedContributes[2]);
	mcemaths_mul_3_4(temp[2].shadowcoord, correctedContributes[2]);

	PROCDATA_PLANET* output = (PROCDATA_PLANET*)interpolatedUserData;

	mcemaths_quatcpy(output->tangent, temp[0].tangent);
	mcemaths_quatcpy(output->binormal, temp[0].binormal);
	mcemaths_quatcpy(output->normal, temp[0].normal);
	mcemaths_quatcpy(output->worldPos, temp[0].worldPos);
	mcemaths_quatcpy(output->texcoord, temp[0].texcoord);
	mcemaths_quatcpy(output->shadowcoord, temp[0].shadowcoord);

	mcemaths_add_3_4_ip(output->tangent, temp[1].tangent);
	mcemaths_add_3_4_ip(output->binormal, temp[1].binormal);
	mcemaths_add_3_4_ip(output->normal, temp[1].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[1].worldPos);
	mcemaths_add_3_4_ip(output->texcoord, temp[1].texcoord);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[1].shadowcoord);

	mcemaths_add_3_4_ip(output->tangent, temp[2].tangent);
	mcemaths_add_3_4_ip(output->binormal, temp[2].binormal);
	mcemaths_add_3_4_ip(output->normal, temp[2].normal);
	mcemaths_add_3_4_ip(output->worldPos, temp[2].worldPos);
	mcemaths_add_3_4_ip(output->texcoord, temp[2].texcoord);
	mcemaths_add_3_4_ip(output->shadowcoord, temp[2].shadowcoord);
}
Ejemplo n.º 11
0
void FP_Earth::process(const FragmentProcessorInput* input, FragmentProcessorOutput* output) const
{
	ALIGN16 float outputColour[4];
	ALIGN16 float bumpNormal[4];
	ALIGN16 float nightColour[4];
	PURESOFTBGRA bytesColour;

	const PROCDATA_PLANET* inData = (const PROCDATA_PLANET*)input->user;

	PuresoftSampler2D::get4(m_diffuseTex, inData->texcoord[0], inData->texcoord[1], &bytesColour);
	outputColour[0] = bytesColour.elems.b;
	outputColour[1] = bytesColour.elems.g;
	outputColour[2] = bytesColour.elems.r;
	outputColour[3] = bytesColour.elems.a;

	PuresoftSampler2D::get4(m_nightTex, inData->texcoord[0], inData->texcoord[1], &bytesColour);
	nightColour[0] = bytesColour.elems.b;
	nightColour[1] = bytesColour.elems.g;
	nightColour[2] = bytesColour.elems.r;
	nightColour[3] = bytesColour.elems.a;

	PuresoftSampler2D::get4(m_bumpTex, inData->texcoord[0], inData->texcoord[1], &bytesColour);
	bumpNormal[0] = bytesColour.elems.r;
	bumpNormal[1] = bytesColour.elems.g;
	bumpNormal[2] = bytesColour.elems.b;
	bumpNormal[3] = 0;

	float shadowFactor = PuresoftSamplerProjection::get(m_shadowTex, inData->shadowcoord);

	PuresoftSampler2D::get4(m_specularTex, inData->texcoord[0], inData->texcoord[1], &bytesColour);
	float specularControl = bytesColour.elems.r / 255.0f;

	mcemaths_div_3_4(bumpNormal, 255.0f);
	mcemaths_mul_3_4(bumpNormal, 2.0f);
	mcemaths_sub_4by1(bumpNormal, 1.0f);

	ALIGN16 float tbn[16];
	mcemaths_make_tbn(tbn, inData->tangent, inData->binormal, inData->normal);

	mcemaths_transform_m4v4_ip(bumpNormal, tbn);
	mcemaths_norm_3_4(bumpNormal);

	ALIGN16 float L[4];
	mcemaths_sub_3_4(L, m_lightPos, inData->worldPos);
	float distance = mcemaths_len_3_4(L);
	mcemaths_div_3_4(L, distance);

	ALIGN16 float E[4];
	mcemaths_sub_3_4(E, m_cameraPos, inData->worldPos);
	mcemaths_norm_3_4(E);
	ALIGN16 float H[4];
	mcemaths_add_3_4(H, E, L);
	mcemaths_norm_3_4(H);

	float lambert = mcemaths_dot_3_4(L, bumpNormal);

	float specular = mcemaths_dot_3_4(H, bumpNormal);
	specular = specular < 0 ? 0 : specular;
	//specular = pow(specular, 50.0f);
	specular = opt_pow(specular, 50);
	specular *= specularControl;

	mcemaths_add_1to4(outputColour, 255.0f * specular);

	mcemaths_mul_3_4(outputColour, lambert);

	if(lambert < 0.2f)
	{
		mcemaths_add_3_4_ip(outputColour, nightColour);
	}

	mcemaths_mul_3_4(outputColour, shadowFactor);
	mcemaths_clamp_3_4(outputColour, 0, 255.0f);

	bytesColour.elems.r = (unsigned char)outputColour[2];
	bytesColour.elems.g = (unsigned char)outputColour[1];
	bytesColour.elems.b = (unsigned char)outputColour[0];
	bytesColour.elems.a = 0;

	output->write4(0, &bytesColour);
}