Vector4d Triangle::normal_vector(const Vector4d &surface) const { double u, v; std::tie(u, v) = uvCoords(surface); Vector4d normal = (1 - u - v) * n1 + u * n2 + v * n3; normal.normalize(); return normal; }
/* This function is very slow. Look into greedy meshing algorithms as an alternative */ void Chunk::GenrateCube(const glm::ivec3& pos, const glm::ivec3& worldPos) { visible_ = true; char drawSides; bool drawTop = true; bool drawBottom = true; bool drawLeft = true; bool drawRight = true; bool drawFront = true; bool drawBack = true; int x = pos.x; int y = pos.y; int z = pos.z; //cube vertices. glm::ivec3 v1p = v1p_ + pos; glm::ivec3 v2p = v2p_ + pos; glm::ivec3 v3p = v3p_ + pos; glm::ivec3 v4p = v4p_ + pos; glm::ivec3 v5p = v5p_ + pos; glm::ivec3 v6p = v6p_ + pos; glm::ivec3 v7p = v7p_ + pos; glm::ivec3 v8p = v8p_ + pos; glm::vec2 uvCoords(0,0); int v1, v2, v3, v4, v5, v6, v7, v8; //vertex indexes //below if block filters out any block sides which cant be visible. Reducing vertex count, and preventing graphical artifacts if(y > 0) drawTop = !blocks_[x][y-1][z].IsVisible(); if(y < chunkSize_-1) drawBottom = !blocks_[x][y+1][z].IsVisible(); if(x > 0) drawLeft = !blocks_[x-1][y][z].IsVisible(); if(x < chunkSize_-1) drawRight = !blocks_[x+1][y][z].IsVisible(); if(z > 0) drawBack = !blocks_[x][y][z-1].IsVisible(); if(z < chunkSize_-1) drawFront = !blocks_[x][y][z+1].IsVisible(); ////this if block checks the squares next to the outer edge blocks in the chunk to see if they are invisible. If they are ////visible, dont draw these edges. if(y == 0) drawTop = !GetBlockType(worldPos.x, worldPos.y - 1, worldPos.z ); if(y == CHUNK_SIZE-1) drawBottom = !GetBlockType(worldPos.x, worldPos.y + 1, worldPos.z ); if(x == 0) drawLeft = !GetBlockType(worldPos.x - 1, worldPos.y, worldPos.z ); if(x == CHUNK_SIZE-1) drawRight = !GetBlockType(worldPos.x + 1, worldPos.y, worldPos.z ); if(z == 0) drawBack = !GetBlockType(worldPos.x , worldPos.y, worldPos.z - 1); if(z == CHUNK_SIZE-1) drawFront = !GetBlockType(worldPos.x , worldPos.y, worldPos.z + 1); ////bottom if(drawBottom) { //uvCoords = glm::vec2(1-uvStep_ + d_,0); v5 = AddMeshVertex(v5p, downNormal_, uvCoords); //uvCoords = glm::vec2(1 - d_,0); v6 = AddMeshVertex(v6p, downNormal_, uvCoords); //uvCoords = glm::vec2(1 ,uvStep_ - d_); v7 = AddMeshVertex(v7p, downNormal_, uvCoords); //uvCoords = glm::vec2(1-uvStep_ + d_,uvStep_ - d_); v8 = AddMeshVertex(v8p, downNormal_, uvCoords); //tessilate face meshStorage_->GetData().AddTriangleToMesh(v8, v5, v7); meshStorage_->GetData().AddTriangleToMesh(v8, v7, v6); } ////top if(drawTop) { //uvCoords = glm::vec2(0+d_,0+d_); v1 = AddMeshVertex(v1p, upNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_ -d_,0+d_); v2 = AddMeshVertex(v2p, upNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_ -d_,uvStep_-d_); v3 = AddMeshVertex(v3p, upNormal_, uvCoords); //uvCoords = glm::vec2(0+d_,uvStep_ - d_); v4 = AddMeshVertex(v4p, upNormal_, uvCoords); meshStorage_->GetData().AddTriangleToMesh(v2, v4, v1); meshStorage_->GetData().AddTriangleToMesh(v3, v4, v2); } //left face if(drawLeft) { //uvCoords = glm::vec2(uvStep_,0); v1 = AddMeshVertex(v1p, leftNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2, 0); v4 = AddMeshVertex(v4p, leftNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2,uvStep_); v5 = AddMeshVertex(v5p, leftNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_,uvStep_); v7 = AddMeshVertex(v7p, leftNormal_, uvCoords); meshStorage_->GetData().AddTriangleToMesh(v4, v5, v1); meshStorage_->GetData().AddTriangleToMesh(v4, v7, v5); } //right face if(drawRight) { //uvCoords = glm::vec2(uvStep_,0); v2 = AddMeshVertex(v2p, rightNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2, 0); v3 = AddMeshVertex(v3p, rightNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2,uvStep_); v6 = AddMeshVertex(v6p, rightNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_,uvStep_); v8 = AddMeshVertex(v8p, rightNormal_, uvCoords); meshStorage_->GetData().AddTriangleToMesh(v6, v3, v2); meshStorage_->GetData().AddTriangleToMesh(v6, v2, v8); } //front face if(drawFront) { //uvCoords = glm::vec2(uvStep_,0); v7 = AddMeshVertex(v7p, frontNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2, 0); v6 = AddMeshVertex(v6p, frontNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2,uvStep_); v3 = AddMeshVertex(v3p, frontNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_,uvStep_); v4 = AddMeshVertex(v4p, frontNormal_, uvCoords); meshStorage_->GetData().AddTriangleToMesh(v7, v4, v3); meshStorage_->GetData().AddTriangleToMesh(v7, v3, v6); } //back face if(drawBack) { //uvCoords = glm::vec2(uvStep_,0); v1 = AddMeshVertex(v1p, backNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2, 0); v2 = AddMeshVertex(v2p, backNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_*2,uvStep_); v5 = AddMeshVertex(v5p, backNormal_, uvCoords); //uvCoords = glm::vec2(uvStep_,uvStep_); v8 = AddMeshVertex(v8p, backNormal_, uvCoords); meshStorage_->GetData().AddTriangleToMesh(v5, v2, v1); meshStorage_->GetData().AddTriangleToMesh(v5, v8, v2); } }