Exemplo n.º 1
0
Triangle::Triangle(Point3D p1, Point3D p2, Point3D p3, Texture* texture) :
		Primitive() {
	this->p1 = p1;
	this->p2 = p2;
	this->p3 = p3;
	this->s = 0;
	this->t = 0;
	this->texture = texture;

	vector<Point3D> points;
	points.push_back(this->p1);
	points.push_back(this->p2);
	points.push_back(this->p3);

	normal = calculateSurfaceNormal(points);

	// start calculating texture points
	// sides length of triangle
	float a, b, c;

	a = sqrt(
			pow(p1.getX() - p3.getX(), 2) + pow(p1.getY() - p3.getY(), 2)
					+ pow(p1.getZ() - p3.getZ(), 2));

	b = sqrt(
			pow(p2.getX() - p1.getX(), 2) + pow(p2.getY() - p1.getY(), 2)
					+ pow(p2.getZ() - p1.getZ(), 2));

	c = sqrt(
			pow(p3.getX() - p2.getX(), 2) + pow(p3.getY() - p2.getY(), 2)
					+ pow(p3.getZ() - p2.getZ(), 2));

	// cosine internal angles of triangle
	float alpha, c_SinAlpha, b_cCosAlpha;

	alpha = (pow(b, 2) + pow(c, 2) - pow(a, 2)) / (2 * b * c);
	b_cCosAlpha = b - c * alpha;
	c_SinAlpha = sqrt(pow(a, 2) - pow(b_cCosAlpha, 2));

	P0 = Point2D(b_cCosAlpha, c_SinAlpha);
	P1 = Point2D(0, 0);
	P2 = Point2D(b, 0);

	if (texture) {
		this->s = P2.getX() / texture->getTexLenght_s();
		this->t = P0.getY() / texture->getTexLenght_t();

		P2.setX(s);
		P0 = Point2D(s / 2, t);
	}
}
void GeometryTerrain::addTri(TriType type_, const glm::vec3& a_rv0, const glm::vec3& a_rv1, const glm::vec3& a_rv2, const glm::vec4& a_colour, const int& triNum_) 
{
	if (type_ == TRI_TERRAIN)
	{
		if (sm_singleton->terrainTriCount < sm_singleton->maxTerrainTris)
		{
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.x = a_rv0.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.y = a_rv0.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.z = a_rv0.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.w = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.x = a_rv1.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.y = a_rv1.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.z = a_rv1.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.w = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.x = a_rv2.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.y = a_rv2.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.z = a_rv2.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.w = 1;

			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.r = a_colour.r;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.g = a_colour.g;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.b = a_colour.b;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.a = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.r = a_colour.r;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.g = a_colour.g;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.b = a_colour.b;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.a = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.r = a_colour.r;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.g = a_colour.g;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.b = a_colour.b;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.a = 1;

			if (triNum_ <= 0)
			{
				//set vertex UV's
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.s = 0;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.t = 0;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.s = 0;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.t = 1;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.s = 1;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.t = 1;
			}
			if (triNum_ >= 1)
			{
				//set vertex UV's
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.s = 0;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.t = 0;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.s = 1;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.t = 1;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.s = 1;
				sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.t = 0;
			}

			//add surface normals
			glm::vec4 n = calculateSurfaceNormal(a_rv0, a_rv1, a_rv2);
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.nx = n.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.ny = n.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.nz = n.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v0.nw = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.nx = n.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.ny = n.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.nz = n.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v1.nw = 1;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.nx = n.x;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.ny = n.y;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.nz = n.z;
			sm_singleton->terrainTris[sm_singleton->terrainTriCount].v2.nw = 1;

			sm_singleton->terrainTriCount++;
		}
	}
	else if (type_ == TRI_PLAIN)
	{
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.x = a_rv0.x;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.y = a_rv0.y;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.z = a_rv0.z;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.w = 1;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.x = a_rv1.x;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.y = a_rv1.y;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.z = a_rv1.z;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.w = 1;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.x = a_rv2.x;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.y = a_rv2.y;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.z = a_rv2.z;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.w = 1;

		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.r = a_colour.r;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.g = a_colour.g;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.b = a_colour.b;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v0.a = 1;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.r = a_colour.r;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.g = a_colour.g;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.b = a_colour.b;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v1.a = 1;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.r = a_colour.r;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.g = a_colour.g;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.b = a_colour.b;
		sm_singleton->plainTris[sm_singleton->plainTriCount].v2.a = 1;

		sm_singleton->plainTriCount++;
	}
}