Exemple #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);
}
Exemple #2
0
void IP_SingleColour::correctInterpolation(void* interpolatedUserData, const void* interpolatedUserDataStart, float correctionFactor2) const
{
	PROCDATA_SINGLECOLOUR* output = (PROCDATA_SINGLECOLOUR*)interpolatedUserData;
	const PROCDATA_SINGLECOLOUR* start = (const PROCDATA_SINGLECOLOUR*)interpolatedUserDataStart;
	copyUserDataSingleColour(output, start);
	mcemaths_mul_3_4(output->normal, correctionFactor2);
	mcemaths_mul_3_4(output->worldPos, correctionFactor2);
	mcemaths_mul_3_4(output->shadowcoord, correctionFactor2);
}
Exemple #3
0
void IP_Cloud::correctInterpolation(void* interpolatedUserData, const void* interpolatedUserDataStart, float correctionFactor2) const
{
	PROCDATA_CLOUD* output = (PROCDATA_CLOUD*)interpolatedUserData;
	const PROCDATA_CLOUD* start = (const PROCDATA_CLOUD*)interpolatedUserDataStart;
	copyUserData(output, start);
	mcemaths_mul_3_4(output->normal, correctionFactor2);
	mcemaths_mul_3_4(output->worldPos, correctionFactor2);
	mcemaths_mul_3_4(output->texcoord, correctionFactor2);
	mcemaths_mul_3_4(output->shadowcoord, correctionFactor2);
}
Exemple #4
0
void IP_DiffuseOnly::correctInterpolation(void* interpolatedUserData, const void* interpolatedUserDataStart, float correctionFactor2) const
{
	PROCDATA_DIFFUSEONLY* output = (PROCDATA_DIFFUSEONLY*)interpolatedUserData;
	const PROCDATA_DIFFUSEONLY* start = (const PROCDATA_DIFFUSEONLY*)interpolatedUserDataStart;
	copyUserDataDiffuseOnly(output, start);
	mcemaths_mul_3_4(output->normal, correctionFactor2);
	mcemaths_mul_3_4(output->worldPos, correctionFactor2);
	mcemaths_mul_3_4(output->texcoord, correctionFactor2);
	mcemaths_mul_3_4(output->shadowcoord, correctionFactor2);
}
Exemple #5
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);
}
Exemple #6
0
void IP_SingleColour::calcStep(void* interpolatedUserDataStep, const void* interpolatedUserDataStart, const void* interpolatedUserDataEnd, int stepCount) const
{
	PROCDATA_SINGLECOLOUR* start = (PROCDATA_SINGLECOLOUR*)interpolatedUserDataStart;
	PROCDATA_SINGLECOLOUR* end = (PROCDATA_SINGLECOLOUR*)interpolatedUserDataEnd;
	PROCDATA_SINGLECOLOUR* step = (PROCDATA_SINGLECOLOUR*)interpolatedUserDataStep;

	float reciprocalStepCount = 0 == stepCount ? 1.0f : 1.0f / (float)stepCount;
	mcemaths_sub_3_4(step->normal, end->normal, start->normal);
	mcemaths_sub_3_4(step->worldPos, end->worldPos, start->worldPos);
	mcemaths_sub_3_4(step->shadowcoord, end->shadowcoord, start->shadowcoord);

	mcemaths_mul_3_4(step->normal, reciprocalStepCount);
	mcemaths_mul_3_4(step->worldPos, reciprocalStepCount);
	mcemaths_mul_3_4(step->shadowcoord, reciprocalStepCount);
}
Exemple #7
0
void IP_CloudShadow::correctInterpolation(void* interpolatedUserData, const void* interpolatedUserDataStart, float correctionFactor2) const
{
	PROCDATA_CLOUDSHADOW* output = (PROCDATA_CLOUDSHADOW*)interpolatedUserData;
	const PROCDATA_CLOUDSHADOW* start = (const PROCDATA_CLOUDSHADOW*)interpolatedUserDataStart;
	copyUserData(output, start);
	mcemaths_mul_3_4(output->texcoord, correctionFactor2);
}
Exemple #8
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);
}
Exemple #9
0
void IP_DiffuseOnly::calcStep(void* interpolatedUserDataStep, const void* interpolatedUserDataStart, const void* interpolatedUserDataEnd, int stepCount) const
{
	PROCDATA_DIFFUSEONLY* start = (PROCDATA_DIFFUSEONLY*)interpolatedUserDataStart;
	PROCDATA_DIFFUSEONLY* end = (PROCDATA_DIFFUSEONLY*)interpolatedUserDataEnd;
	PROCDATA_DIFFUSEONLY* step = (PROCDATA_DIFFUSEONLY*)interpolatedUserDataStep;

	float reciprocalStepCount = 0 == stepCount ? 1.0f : 1.0f / (float)stepCount;
	mcemaths_sub_3_4(step->normal, end->normal, start->normal);
	mcemaths_sub_3_4(step->worldPos, end->worldPos, start->worldPos);
	mcemaths_sub_3_4(step->texcoord, end->texcoord, start->texcoord);
	mcemaths_sub_3_4(step->shadowcoord, end->shadowcoord, start->shadowcoord);

	mcemaths_mul_3_4(step->normal, reciprocalStepCount);
	mcemaths_mul_3_4(step->worldPos, reciprocalStepCount);
	mcemaths_mul_3_4(step->texcoord, reciprocalStepCount);
	mcemaths_mul_3_4(step->shadowcoord, reciprocalStepCount);
}
Exemple #10
0
void IP_CloudShadow::calcStep(void* interpolatedUserDataStep, const void* interpolatedUserDataStart, const void* interpolatedUserDataEnd, int stepCount) const
{
	PROCDATA_CLOUDSHADOW* start = (PROCDATA_CLOUDSHADOW*)interpolatedUserDataStart;
	PROCDATA_CLOUDSHADOW* end = (PROCDATA_CLOUDSHADOW*)interpolatedUserDataEnd;
	PROCDATA_CLOUDSHADOW* step = (PROCDATA_CLOUDSHADOW*)interpolatedUserDataStep;

	float reciprocalStepCount = 0 == stepCount ? 1.0f : 1.0f / (float)stepCount;
	mcemaths_sub_3_4(step->texcoord, end->texcoord, start->texcoord);
	mcemaths_mul_3_4(step->texcoord, reciprocalStepCount);
}
Exemple #11
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);
}
Exemple #12
0
void FP_SingleColourNoLighting::process(const FragmentProcessorInput* input, FragmentProcessorOutput* output) const
{
	const PROCDATA_SINGLECOLOUR* inData = (const PROCDATA_SINGLECOLOUR*)input->user;

	ALIGN16 float outputColour[4];
	mcemaths_quatcpy(outputColour, m_diffuse);
	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);
}
Exemple #13
0
void IP_Planet::correctInterpolation(void* interpolatedUserData, const void* interpolatedUserDataStart, float correctionFactor2) const
{
	PROCDATA_PLANET* output = (PROCDATA_PLANET*)interpolatedUserData;
	const PROCDATA_PLANET* start = (const PROCDATA_PLANET*)interpolatedUserDataStart;
	copyUserData(output, start);
	mcemaths_mul_3_4(output->tangent, correctionFactor2);
	mcemaths_mul_3_4(output->binormal, correctionFactor2);
	mcemaths_mul_3_4(output->normal, correctionFactor2);
	mcemaths_mul_3_4(output->worldPos, correctionFactor2);
	mcemaths_mul_3_4(output->texcoord, correctionFactor2);
	mcemaths_mul_3_4(output->shadowcoord, correctionFactor2);
}
Exemple #14
0
void IP_Planet::calcStep(void* interpolatedUserDataStep, const void* interpolatedUserDataStart, const void* interpolatedUserDataEnd, int stepCount) const
{
	PROCDATA_PLANET* start = (PROCDATA_PLANET*)interpolatedUserDataStart;
	PROCDATA_PLANET* end = (PROCDATA_PLANET*)interpolatedUserDataEnd;
	PROCDATA_PLANET* step = (PROCDATA_PLANET*)interpolatedUserDataStep;

	float reciprocalStepCount = 0 == stepCount ? 1.0f : 1.0f / (float)stepCount;
	mcemaths_sub_3_4(step->tangent, end->tangent, start->tangent);
	mcemaths_sub_3_4(step->binormal, end->binormal, start->binormal);
	mcemaths_sub_3_4(step->normal, end->normal, start->normal);
	mcemaths_sub_3_4(step->worldPos, end->worldPos, start->worldPos);
	mcemaths_sub_3_4(step->texcoord, end->texcoord, start->texcoord);
	mcemaths_sub_3_4(step->shadowcoord, end->shadowcoord, start->shadowcoord);

	mcemaths_mul_3_4(step->tangent, reciprocalStepCount);
	mcemaths_mul_3_4(step->binormal, reciprocalStepCount);
	mcemaths_mul_3_4(step->normal, reciprocalStepCount);
	mcemaths_mul_3_4(step->worldPos, reciprocalStepCount);
	mcemaths_mul_3_4(step->texcoord, reciprocalStepCount);
	mcemaths_mul_3_4(step->shadowcoord, reciprocalStepCount);
}
Exemple #15
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);
}
Exemple #16
0
bool write_face(HOBJXIO hobjxio, const string& name, const faces& fcs, const obj_mesh_data& dat, const material& mtl)
{
	static vec4_coll vertices;
	static vec4_coll normals;
	static vec4_coll tangents;
	static vec2_coll texcoords;

	mesh_info mesh;
	mesh.num_indices = 0;
	mesh.indices = NULL;

	for(int i = 0; i < faces::MAX; i++)
	{
		const face& fc = fcs.face_data[i];
		// stat vertices
		mesh.num_vertices = 0;
		for(int i = 0; i < (int)fc.size(); i++)
			// 3 indices for 1 triangle, 4 for 2, 5 for 3, ... n indices for n-2 triangles make (n-2)*3 vertices
			mesh.num_vertices += (fc[i].vertIndices.size() - 2) * 3;

		if(0 == mesh.num_vertices)
			continue;

		// prepare container
		vertices.clear();
		normals.clear();
		tangents.clear();
		texcoords.clear();

		// for each facet
		for(int i = 0; i < (int)fc.size(); i++)
		{
			const facet& f = fc[i];
			// facet -> triangles
			for(int j = 1; j < (int)f.vertIndices.size() - 1; j++)
			{
				vertices.push_back(dat.vertices[f.vertIndices[    0]]);
				vertices.push_back(dat.vertices[f.vertIndices[    j]]);
				vertices.push_back(dat.vertices[f.vertIndices[j + 1]]);
			}
		}
		ATLASSERT(vertices.size() > 0);
		mesh.vertices = &vertices[0];

		// for each facet
		for(int i = 0; i < (int)fc.size(); i++)
		{
			const facet& f = fc[i];
			// facet -> triangles
			for(int j = 1; j < (int)f.normIndices.size() - 1; j++)
			{
				normals.push_back(dat.normals[f.normIndices[    0]]);
				normals.push_back(dat.normals[f.normIndices[    j]]);
				normals.push_back(dat.normals[f.normIndices[j + 1]]);
			}
		}

		// unlike vertices, normal data can be absent
		if(0 == normals.size()) // if normal not exists, we generate
		{
			for(int i = 0; i < (int)vertices.size(); i += 3)
			{
				const vec4& a = vertices[    i];
				const vec4& b = vertices[i + 1];
				const vec4& c = vertices[i + 2];
				vec4 edge1, edge2, n;
				mcemaths_sub_3_4(edge1, c, b);
				mcemaths_sub_3_4(edge2, a, b);
				mcemaths_cross_3(n, edge1, edge2);
				mcemaths_norm_3_4(n);
				normals.push_back(n);
				normals.push_back(n);
				normals.push_back(n);
			}
		}
		mesh.normals = &normals[0];
		mesh.has_normals = true;

		// for each facet
		for(int i = 0; i < (int)fc.size(); i++)
		{
			const facet& f = fc[i];
			// facet -> triangles
			for(int j = 1; j < (int)f.texIndices.size() - 1; j++)
			{
				texcoords.push_back(dat.texcoords[f.texIndices[    0]]);
				texcoords.push_back(dat.texcoords[f.texIndices[    j]]);
				texcoords.push_back(dat.texcoords[f.texIndices[j + 1]]);
			}
		}

 		mesh.texcoords = NULL;
 		mesh.tangents = NULL;
 		mesh.has_texcoords = mesh.has_tangents = false;
		if(texcoords.size() > 0) // unlike vertices, texture coordinate can also be absent
		{
			mesh.texcoords = &texcoords[0];
			mesh.has_texcoords = true;

			// if texcoords exist, generate tangents (save time for game initialization as much as possible)
 			for(int i = 0; i < (int)vertices.size(); i += 3)
 			{
 				const vec4&  a = vertices [    i];
 				const vec4&  b = vertices [i + 1];
 				const vec4&  c = vertices [i + 2];
				const vec2& ta2 = texcoords[    i];
				const vec2& tb2 = texcoords[i + 1];
				const vec2& tc2 = texcoords[i + 2];
				vec4 ta(ta2.x, ta2.y, 0, 0);
				vec4 tb(tb2.x, tb2.y, 0, 0);
				vec4 tc(tc2.x, tc2.y, 0, 0);
 				vec4 modvec1(0.0f), modvec4(0.0f), texvec1(0.0f), texvec4(0.0f);
 				mcemaths_sub_3_4(modvec1, c , a);
 				mcemaths_sub_3_4(modvec4, b , a);
 				mcemaths_sub_3_4(texvec1, tc, ta);
 				mcemaths_sub_3_4(texvec4, tb, ta);
 				mcemaths_mul_3_4(modvec1, texvec4.y);
 				mcemaths_mul_3_4(modvec4, texvec1.y);
 				mcemaths_sub_3_4_ip(modvec1, modvec4);
 				mcemaths_div_3_4(modvec1, texvec1.x * texvec4.y - texvec4.x * texvec1.y);
 				mcemaths_norm_3_4(modvec1);
 				tangents.push_back(modvec1);
 				tangents.push_back(modvec1);
 				tangents.push_back(modvec1);
 			}
			mesh.tangents = &tangents[0];
			mesh.has_tangents = true;
		}

		mesh.mesh_name = name;
		mesh.ambient_colour = vec4(mtl.ambientColour.x, mtl.ambientColour.y, mtl.ambientColour.z, 1.0f);
		mesh.diffuse_colour = vec4(mtl.diffuseColour.x, mtl.diffuseColour.y, mtl.diffuseColour.z, 1.0f);
		mesh.specular_colour = vec4(mtl.specularColour.x, mtl.specularColour.y, mtl.specularColour.z, 1.0f);
		mesh.specular_exponent = mtl.specularExponent;
		mesh.diffuse_file = mtl.diffuseFile;
		mesh.bump_file = mtl.bumpFile;
		mesh.spc_file = mtl.spcFile;
		mesh.spe_file = mtl.speFile;
		mesh.programme = mtl.programmeName;

		if(!write_mesh(hobjxio, mesh))
			return false;
	}

	return true;
}
Exemple #17
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);
}
Exemple #18
0
const vec4& vec4::mul(float scalar)
{
	mcemaths_mul_3_4(&x, scalar);
	return *this;
}
Exemple #19
0
void FP_Satellite::process(const FragmentProcessorInput* input, FragmentProcessorOutput* output) const
{
	ALIGN16 float outputColour[4];
	ALIGN16 float bumpNormal[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_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);

	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);

	mcemaths_add_1to4(outputColour, 255.0f * specular);

	mcemaths_mul_3_4(outputColour, lambert);

	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);
}