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