示例#1
0
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;
}
示例#2
0
/*
  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);
	}
}