Week12 [14/12]
Added UVCheck texture file Added UV perspective Variables to the Vertex Class Added Texture Draw method to the Rasteriser
This commit is contained in:
		
							
								
								
									
										145
									
								
								Rasteriser.cpp
									
									
									
									
									
								
							
							
						
						
									
										145
									
								
								Rasteriser.cpp
									
									
									
									
									
								
							@ -52,10 +52,10 @@ bool Rasteriser::Initialise()
 | 
			
		||||
		}
 | 
			
		||||
	}		
 | 
			
		||||
	
 | 
			
		||||
	//_lights.push_back(new AmbientLight(50, 50, 50));
 | 
			
		||||
	_lights.push_back(new AmbientLight(255, 255, 255));
 | 
			
		||||
	//_lights.push_back(new DirectionalLight(Vector3D(-1, 0, 0), 150, 150, 150));
 | 
			
		||||
	_lights.push_back(new PointLight(Vertex(0, 0, -10), 0, 1, 0.01f, 150, 0, 0));
 | 
			
		||||
	_lights.push_back(new AmbientLight(50, 50, 50));
 | 
			
		||||
	//_lights.push_back(new AmbientLight(255, 255, 255));
 | 
			
		||||
	_lights.push_back(new DirectionalLight(Vector3D(-1, 0, -1), 150, 150, 150));
 | 
			
		||||
	//_lights.push_back(new PointLight(Vertex(0, 0, -10), 0, 1, 0.01f, 150, 0, 0));
 | 
			
		||||
	_cameras.push_back(Camera(0.0f, 0.0f, 0.0f, Vertex(0.0f, 0.0f, -50.0f)));
 | 
			
		||||
 | 
			
		||||
	_screenMinimized = false;
 | 
			
		||||
@ -132,7 +132,7 @@ float Rasteriser::Interpolate(int y, int x0, int x1, int y0, int y1)
 | 
			
		||||
 | 
			
		||||
float Rasteriser::Lerp(float a, float b, float t)
 | 
			
		||||
{
 | 
			
		||||
	return a + (b - a) * t;
 | 
			
		||||
	return (1 - t) * a + t * b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Rasteriser::Lerp(int a, int b, float t)
 | 
			
		||||
@ -140,8 +140,12 @@ float Rasteriser::Lerp(int a, int b, float t)
 | 
			
		||||
	return Lerp((float)a, (float)b, t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int toDraw = 1;
 | 
			
		||||
int drawn = 0;
 | 
			
		||||
 | 
			
		||||
void Rasteriser::Update(const Bitmap& bitmap)
 | 
			
		||||
{			
 | 
			
		||||
	drawn = 0;
 | 
			
		||||
	if (bitmap.GetWidth() == 0 || bitmap.GetHeight() == 0)
 | 
			
		||||
	{
 | 
			
		||||
		_screenMinimized = true;
 | 
			
		||||
@ -153,7 +157,7 @@ void Rasteriser::Update(const Bitmap& bitmap)
 | 
			
		||||
 | 
			
		||||
	if (!_screenMinimized)
 | 
			
		||||
	{
 | 
			
		||||
		int currentRot = (_rotation % 360);
 | 
			
		||||
		int currentRot = 0;// 45; // (_rotation % 360);
 | 
			
		||||
		Vertex startPos = Vertex(0, 0, 20);
 | 
			
		||||
		int currentZOff = 0;
 | 
			
		||||
		int currentModelIndex = 0;
 | 
			
		||||
@ -569,7 +573,7 @@ void Rasteriser::FillPolygonGouraud(HDC hDc, vector<Vertex>& verts)
 | 
			
		||||
		float cBlue = Lerp(verts[0].GetB(), verts[2].GetB(), vDiff);
 | 
			
		||||
		temp.SetColor(BoundsCheck(0, 255, (int)cRed), BoundsCheck(0, 255, (int)cGreen), BoundsCheck(0, 255, (int)cBlue));
 | 
			
		||||
 | 
			
		||||
		if (verts[1].GetX() <= temp.GetX())
 | 
			
		||||
		if (verts[1].GetX() < temp.GetX())
 | 
			
		||||
		{
 | 
			
		||||
			FillGouraudSideTriangle(hDc, verts[0], verts[1], temp);
 | 
			
		||||
			FillGouraudSideTriangle(hDc, verts[2], verts[1], temp);
 | 
			
		||||
@ -628,15 +632,26 @@ void Rasteriser::FillGouraudSideTriangle(HDC hDc, const Vertex& v1, const Vertex
 | 
			
		||||
 | 
			
		||||
		if (tempA.GetX() < tempB.GetX())
 | 
			
		||||
		{
 | 
			
		||||
			leftEndPoint = tempA.GetX() - 1.0f;
 | 
			
		||||
			leftEndPoint = tempA.GetX();
 | 
			
		||||
			rightEndPoint = tempB.GetX() + 1.0f;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			leftEndPoint = tempB.GetX() - 1.0f;
 | 
			
		||||
			leftEndPoint = tempB.GetX();
 | 
			
		||||
			rightEndPoint = tempA.GetX() + 1.0f;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//float iRedA = Interpolate(tempA.GetY(), (float)v1.GetR(), (float)v2.GetR(), v1.GetY(), v2.GetY());
 | 
			
		||||
		//float iRedB = Interpolate(tempA.GetY(), (float)v1.GetR(), (float)v3.GetR(), v1.GetY(), v3.GetY());
 | 
			
		||||
		//float iGreenA = Interpolate(tempA.GetY(), (float)v1.GetG(), (float)v2.GetG(), v1.GetY(), v2.GetY());
 | 
			
		||||
		//float iGreenB = Interpolate(tempA.GetY(), (float)v1.GetG(), (float)v3.GetG(), v1.GetY(), v3.GetY());
 | 
			
		||||
		//float iBlueA = Interpolate(tempA.GetY(), (float)v1.GetB(), (float)v2.GetB(), v1.GetY(), v2.GetY());
 | 
			
		||||
		//float iBlueB = Interpolate(tempA.GetY(), (float)v1.GetB(), (float)v3.GetB(), v1.GetY(), v3.GetY());
 | 
			
		||||
 | 
			
		||||
		// Interpolate the Edge Colors of the 3 Vertex, Lerping seems to give better results given the 
 | 
			
		||||
		// non precise nature of converting the floats into ints since it works on the start and end, and
 | 
			
		||||
		// interpolates fixed between those values (regular interpolation would sometimes overflow and cause
 | 
			
		||||
		// a value higher then 255 to be used.
 | 
			
		||||
		float iRedA = Lerp(v1.GetR(), v2.GetR(), (float)i / (float)dx1);
 | 
			
		||||
		float iRedB = Lerp(v1.GetR(), v3.GetR(), (float)i / (float)dx1);
 | 
			
		||||
		float iGreenA = Lerp(v1.GetG(), v2.GetG(), (float)i / (float)dx1);
 | 
			
		||||
@ -647,7 +662,7 @@ void Rasteriser::FillGouraudSideTriangle(HDC hDc, const Vertex& v1, const Vertex
 | 
			
		||||
		int xLength = (int)ceil(rightEndPoint) - (int)ceil(leftEndPoint);
 | 
			
		||||
		int ci = 0;
 | 
			
		||||
 | 
			
		||||
		for (int xi = (int)ceil(leftEndPoint); xi <= (int)ceil(rightEndPoint); xi++)
 | 
			
		||||
		for (int xi = (int)leftEndPoint; xi <= (int)rightEndPoint; xi++)
 | 
			
		||||
		{				
 | 
			
		||||
			float ti = (float)ci / (float)xLength;
 | 
			
		||||
			float redTmp = Lerp(iRedA, iRedB, ti);
 | 
			
		||||
@ -690,22 +705,22 @@ void Rasteriser::FillGouraudSideTriangle(HDC hDc, const Vertex& v1, const Vertex
 | 
			
		||||
			{
 | 
			
		||||
				if (changed2)
 | 
			
		||||
				{
 | 
			
		||||
					tempB.SetX((float)tempB.GetXInt() + (float)signx2);
 | 
			
		||||
					tempB.SetX((float)tempB.GetX() + (float)signx2);
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					tempB.SetY((float)tempB.GetYInt() + (float)signy2);
 | 
			
		||||
					tempB.SetY((float)tempB.GetY() + (float)signy2);
 | 
			
		||||
				}
 | 
			
		||||
				e2 = e2 - 2 * dx2;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (changed2)
 | 
			
		||||
			{
 | 
			
		||||
				tempB.SetY((float)tempB.GetYInt() + (float)signy2);
 | 
			
		||||
				tempB.SetY((float)tempB.GetY() + (float)signy2);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				tempB.SetX((float)tempB.GetXInt() + (float)signx2);
 | 
			
		||||
				tempB.SetX((float)tempB.GetX() + (float)signx2);
 | 
			
		||||
			}
 | 
			
		||||
			e2 = e2 + 2 * dy2;
 | 
			
		||||
		}
 | 
			
		||||
@ -727,10 +742,18 @@ void Rasteriser::FillPolygonTextured(HDC hDc, Model& model, vector<Vertex>& vert
 | 
			
		||||
	{
 | 
			
		||||
		Vertex temp = Vertex(verts[0].GetX() + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (verts[2].GetX() - verts[0].GetX()), verts[1].GetY(), verts[1].GetZ());
 | 
			
		||||
		temp.SetNormal(verts[1].GetNormal());		
 | 
			
		||||
				
 | 
			
		||||
		//model.GetUVCoord(verts[1].GetUVIndex()).GetU() + ((model.GetUVCoord(verts[1].GetUVIndex()).GetV() - model.GetUVCoord(verts[0].GetUVIndex()).GetV()) / (model.GetUVCoord(verts[2].GetUVIndex()).GetV() - model.GetUVCoord(verts[0].GetUVIndex()).GetV())) * (model.GetUVCoord(verts[2].GetUVIndex()).GetU() - model.GetUVCoord(verts[0].GetUVIndex()).GetU());
 | 
			
		||||
 | 
			
		||||
		float tempU = model.GetUVCoord(verts[0].GetUVIndex()).GetU() + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (model.GetUVCoord(verts[2].GetUVIndex()).GetU() - model.GetUVCoord(verts[0].GetUVIndex()).GetU());
 | 
			
		||||
		float tempV = model.GetUVCoord(verts[0].GetUVIndex()).GetV() + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (model.GetUVCoord(verts[2].GetUVIndex()).GetV() - model.GetUVCoord(verts[0].GetUVIndex()).GetV());
 | 
			
		||||
		float uc0 = model.GetUVCoord(verts[0].GetUVIndex()).GetU();
 | 
			
		||||
		float vc0 = model.GetUVCoord(verts[0].GetUVIndex()).GetV();
 | 
			
		||||
		float uc1 = model.GetUVCoord(verts[1].GetUVIndex()).GetU();
 | 
			
		||||
		float vc1 = model.GetUVCoord(verts[1].GetUVIndex()).GetV();
 | 
			
		||||
		float uc2 = model.GetUVCoord(verts[2].GetUVIndex()).GetU();
 | 
			
		||||
		float vc2 = model.GetUVCoord(verts[2].GetUVIndex()).GetV();
 | 
			
		||||
 | 
			
		||||
		float tempU = uc0 + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (uc2 - uc0);
 | 
			
		||||
		float tempV = vc0 + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (vc2 - vc0);
 | 
			
		||||
		UVCoord tempCoords = UVCoord(tempU, tempV);
 | 
			
		||||
 | 
			
		||||
		float cRed = verts[0].GetR() + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (verts[2].GetR() - verts[0].GetR());
 | 
			
		||||
@ -738,19 +761,20 @@ void Rasteriser::FillPolygonTextured(HDC hDc, Model& model, vector<Vertex>& vert
 | 
			
		||||
		float cBlue = verts[0].GetB() + ((verts[1].GetY() - verts[0].GetY()) / (verts[2].GetY() - verts[0].GetY())) * (verts[2].GetB() - verts[0].GetB());
 | 
			
		||||
		temp.SetColor(BoundsCheck(0, 255, (int)cRed), BoundsCheck(0, 255, (int)cGreen), BoundsCheck(0, 255, (int)cBlue));
 | 
			
		||||
 | 
			
		||||
		if (verts[1].GetX() <= temp.GetX())
 | 
			
		||||
		if (drawn < toDraw + 100)
 | 
			
		||||
		{
 | 
			
		||||
			temp.SetUVIndex(verts[2].GetUVIndex());
 | 
			
		||||
			FillTexturedSideTriangle(hDc, model, verts[0], verts[1], temp, model.GetUVCoord(verts[0].GetUVIndex()), model.GetUVCoord(verts[1].GetUVIndex()), tempCoords);
 | 
			
		||||
			temp.SetUVIndex(verts[0].GetUVIndex());
 | 
			
		||||
			FillTexturedSideTriangle(hDc, model, verts[2], verts[1], temp, model.GetUVCoord(verts[2].GetUVIndex()), model.GetUVCoord(verts[1].GetUVIndex()), tempCoords);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			temp.SetUVIndex(verts[2].GetUVIndex());
 | 
			
		||||
			FillTexturedSideTriangle(hDc, model, verts[0], temp, verts[1], model.GetUVCoord(verts[0].GetUVIndex()), tempCoords, model.GetUVCoord(verts[1].GetUVIndex()));
 | 
			
		||||
			temp.SetUVIndex(verts[0].GetUVIndex());
 | 
			
		||||
			FillTexturedSideTriangle(hDc, model, verts[2], temp, verts[1], model.GetUVCoord(verts[2].GetUVIndex()), tempCoords, model.GetUVCoord(verts[1].GetUVIndex()));
 | 
			
		||||
			if (verts[1].GetX() < temp.GetX())
 | 
			
		||||
			{
 | 
			
		||||
				FillTexturedSideTriangle(hDc, model, verts[0], verts[1], temp, model.GetUVCoord(verts[0].GetUVIndex()), model.GetUVCoord(verts[1].GetUVIndex()), tempCoords);
 | 
			
		||||
				FillTexturedSideTriangle(hDc, model, verts[2], verts[1], temp, model.GetUVCoord(verts[2].GetUVIndex()), model.GetUVCoord(verts[1].GetUVIndex()), tempCoords);
 | 
			
		||||
				drawn++;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				FillTexturedSideTriangle(hDc, model, verts[0], temp, verts[1], model.GetUVCoord(verts[0].GetUVIndex()), tempCoords, model.GetUVCoord(verts[1].GetUVIndex()));
 | 
			
		||||
				FillTexturedSideTriangle(hDc, model, verts[2], temp, verts[1], model.GetUVCoord(verts[2].GetUVIndex()), tempCoords, model.GetUVCoord(verts[1].GetUVIndex()));
 | 
			
		||||
				drawn++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -798,10 +822,6 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
 | 
			
		||||
		dx1 = dy1;
 | 
			
		||||
		dy1 = tempDx;
 | 
			
		||||
 | 
			
		||||
		int tempDu = du1;
 | 
			
		||||
		du1 = dv1;
 | 
			
		||||
		dv1 = tempDu;
 | 
			
		||||
 | 
			
		||||
		changed1 = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -811,10 +831,6 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
 | 
			
		||||
		dx2 = dy2;
 | 
			
		||||
		dy2 = tempDx;
 | 
			
		||||
 | 
			
		||||
		int tempDu = du2;
 | 
			
		||||
		du2 = dv2;
 | 
			
		||||
		dv2 = tempDu;
 | 
			
		||||
 | 
			
		||||
		changed2 = true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -825,27 +841,42 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
 | 
			
		||||
	{
 | 
			
		||||
		float leftEndPoint;
 | 
			
		||||
		float rightEndPoint;
 | 
			
		||||
		float leftUV;
 | 
			
		||||
		float rightUV;
 | 
			
		||||
		float leftU;
 | 
			
		||||
		float rightU;
 | 
			
		||||
		float leftV;
 | 
			
		||||
		float rightV;
 | 
			
		||||
 | 
			
		||||
		if (tempA.GetX() < tempB.GetX())
 | 
			
		||||
		{
 | 
			
		||||
			leftEndPoint = tempA.GetX() - 1.0f;
 | 
			
		||||
			rightEndPoint = tempB.GetX() + 1.0f;		
 | 
			
		||||
			leftUV = tempUVA.GetU();
 | 
			
		||||
			rightUV = tempUVB.GetU();
 | 
			
		||||
			leftU = tempUVA.GetU();
 | 
			
		||||
			rightU = tempUVB.GetU();
 | 
			
		||||
			leftV = tempUVA.GetV();
 | 
			
		||||
			rightV = tempUVB.GetV();
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			leftEndPoint = tempB.GetX() - 1.0f;
 | 
			
		||||
			rightEndPoint = tempA.GetX() + 1.0f;
 | 
			
		||||
			leftUV = tempUVB.GetU();
 | 
			
		||||
			rightUV = tempUVA.GetU();
 | 
			
		||||
			leftU = tempUVB.GetU();
 | 
			
		||||
			rightU = tempUVA.GetU();
 | 
			
		||||
			leftV = tempUVB.GetV();
 | 
			
		||||
			rightV = tempUVA.GetV();
 | 
			
		||||
		}
 | 
			
		||||
				
 | 
			
		||||
		float uy1 = Lerp(uv1.GetV(), uv2.GetV(), (float)i / (float)dx1);
 | 
			
		||||
		float uy2 = Lerp(uv1.GetV(), uv3.GetV(), (float)i / (float)dx1);
 | 
			
		||||
 | 
			
		||||
		float UCoordA = Interpolate(uv1.GetV() + i, uv1.GetU(), uv2.GetU(), uv1.GetV(), uv2.GetV());
 | 
			
		||||
		float UCoordB = Interpolate(uv1.GetV() + i, uv1.GetU(), uv3.GetU(), uv1.GetV(), uv3.GetV());
 | 
			
		||||
		//x0 + (y - y0) * ((x1 - x0) / (y1 - y0))
 | 
			
		||||
		//a + (b - a) * t
 | 
			
		||||
		float UCoordA = Interpolate(tempA.GetY(), uv1.GetU(), uv2.GetU(), v1.GetY(), v2.GetY());
 | 
			
		||||
		float UCoordB = Interpolate(tempA.GetY(), uv1.GetU(), uv3.GetU(), v1.GetY(), v3.GetY());
 | 
			
		||||
		float VCoordA = Interpolate(tempA.GetY(), uv1.GetV(), uv2.GetV(), v1.GetY(), v2.GetY());
 | 
			
		||||
		float VCoordB = Interpolate(tempA.GetY(), uv1.GetV(), uv3.GetV(), v1.GetY(), v3.GetY());
 | 
			
		||||
 | 
			
		||||
		float UCoord = (rightU - leftU) / (rightEndPoint - leftEndPoint);
 | 
			
		||||
		float VCoord = (rightV - leftV) / (rightEndPoint - leftEndPoint);
 | 
			
		||||
 | 
			
		||||
		float iRedA = Lerp(v1.GetR(), v2.GetR(), (float)i / (float)dx1);
 | 
			
		||||
		float iRedB = Lerp(v1.GetR(), v3.GetR(), (float)i / (float)dx1);
 | 
			
		||||
@ -857,19 +888,23 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
 | 
			
		||||
		int xLength = (int)ceil(rightEndPoint) - (int)ceil(leftEndPoint);
 | 
			
		||||
		int ci = 0;
 | 
			
		||||
 | 
			
		||||
		for (int xi = (int)ceil(leftEndPoint); xi <= (int)ceil(rightEndPoint); xi++)
 | 
			
		||||
		{			
 | 
			
		||||
			float ti = (float)ci / (float)xLength;
 | 
			
		||||
			float UCoordTmp = Lerp(leftUV, rightUV, ti);
 | 
			
		||||
			float redTmp = Lerp(iRedA, iRedB, ti) / 100;
 | 
			
		||||
			float greenTmp = Lerp(iGreenA, iGreenB, ti) / 100;
 | 
			
		||||
			float blueTmp = Lerp(iBlueA, iBlueB, ti) / 100;
 | 
			
		||||
		if (i < 10000)
 | 
			
		||||
		{
 | 
			
		||||
			for (int xi = (int)ceil(leftEndPoint); xi <= (int)ceil(rightEndPoint); xi++)
 | 
			
		||||
			{
 | 
			
		||||
				float ti = (float)ci / (float)xLength;
 | 
			
		||||
				float UCoordTmp = Lerp(UCoordA, UCoordB, ti);
 | 
			
		||||
				float VCoordTmp = Lerp(VCoordA, VCoordB, ti);
 | 
			
		||||
				float redTmp = Lerp(iRedA, iRedB, ti) / 100;
 | 
			
		||||
				float greenTmp = Lerp(iGreenA, iGreenB, ti) / 100;
 | 
			
		||||
				float blueTmp = Lerp(iBlueA, iBlueB, ti) / 100;
 | 
			
		||||
 | 
			
		||||
			COLORREF textureColor = model.GetTexture().GetTextureValue((int)UCoordTmp, (int)tempUVA.GetV());
 | 
			
		||||
			COLORREF currentColor = RGB(BoundsCheck(0, 255, (int)(GetRValue(textureColor) * redTmp)), BoundsCheck(0, 255, (int)(GetGValue(textureColor) * greenTmp)), BoundsCheck(0, 255, (int)(GetBValue(textureColor) * blueTmp)));
 | 
			
		||||
				COLORREF textureColor = model.GetTexture().GetTextureValue((int)UCoordTmp, (int)VCoordTmp);
 | 
			
		||||
				COLORREF currentColor = RGB(BoundsCheck(0, 255, (int)(GetRValue(textureColor) * redTmp)), BoundsCheck(0, 255, (int)(GetGValue(textureColor) * greenTmp)), BoundsCheck(0, 255, (int)(GetBValue(textureColor) * blueTmp)));
 | 
			
		||||
 | 
			
		||||
			SetPixel(hDc, xi, tempA.GetYInt(), currentColor);
 | 
			
		||||
			ci++;
 | 
			
		||||
				SetPixel(hDc, xi, tempA.GetYInt(), currentColor);
 | 
			
		||||
				ci++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										60
									
								
								Vertex.cpp
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								Vertex.cpp
									
									
									
									
									
								
							@ -11,6 +11,11 @@ Vertex::Vertex()
 | 
			
		||||
	_r = 0;
 | 
			
		||||
	_g = 0;
 | 
			
		||||
	_b = 0;
 | 
			
		||||
	_uvIndex = -1;
 | 
			
		||||
	_zOriginal = 0;
 | 
			
		||||
	_uOverZ = 0;
 | 
			
		||||
	_vOverZ = 0;
 | 
			
		||||
	_zRecip = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Vertex::Vertex(const float x, const float y, const float z)
 | 
			
		||||
@ -24,6 +29,11 @@ Vertex::Vertex(const float x, const float y, const float z)
 | 
			
		||||
	_r = 0;
 | 
			
		||||
	_g = 0;
 | 
			
		||||
	_b = 0;
 | 
			
		||||
	_uvIndex = -1;
 | 
			
		||||
	_zOriginal = 0;
 | 
			
		||||
	_uOverZ = 0;
 | 
			
		||||
	_vOverZ = 0;
 | 
			
		||||
	_zRecip = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Vertex::Vertex(const float x, const float y, const float z, const float w)
 | 
			
		||||
@ -37,6 +47,11 @@ Vertex::Vertex(const float x, const float y, const float z, const float w)
 | 
			
		||||
	_r = 0;
 | 
			
		||||
	_g = 0;
 | 
			
		||||
	_b = 0;
 | 
			
		||||
	_uvIndex = -1;
 | 
			
		||||
	_zOriginal = 0;
 | 
			
		||||
	_uOverZ = 0;
 | 
			
		||||
	_vOverZ = 0;
 | 
			
		||||
	_zRecip = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Vertex::Vertex(const Vertex & other)
 | 
			
		||||
@ -187,6 +202,44 @@ void Vertex::SetUVIndex(const int index)
 | 
			
		||||
	_uvIndex = index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Vertex::GetZOriginal() const
 | 
			
		||||
{
 | 
			
		||||
	return _zOriginal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Vertex::GetUOverZ() const
 | 
			
		||||
{
 | 
			
		||||
	return _uOverZ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Vertex::SetUOverZ(const float value)
 | 
			
		||||
{
 | 
			
		||||
	_uOverZ = value / _zOriginal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Vertex::GetVOverZ() const
 | 
			
		||||
{
 | 
			
		||||
	return _vOverZ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Vertex::SetVOverZ(const float value)
 | 
			
		||||
{
 | 
			
		||||
	_vOverZ = value / _zOriginal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float Vertex::GetZRecip() const
 | 
			
		||||
{
 | 
			
		||||
	return _zRecip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Vertex::UVCorrect(float u, float v)
 | 
			
		||||
{
 | 
			
		||||
	_zOriginal = _w;
 | 
			
		||||
	_zRecip = 1 / _zOriginal;
 | 
			
		||||
	SetUOverZ(u);
 | 
			
		||||
	SetVOverZ(v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Vertex::GetXInt(bool forceRoundUp) const
 | 
			
		||||
{
 | 
			
		||||
	if (forceRoundUp)
 | 
			
		||||
@ -236,7 +289,7 @@ int Vertex::GetWInt(bool forceRoundUp) const
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Vertex::Dehomogenize()
 | 
			
		||||
{
 | 
			
		||||
{	
 | 
			
		||||
	_x = _x / _w;
 | 
			
		||||
	_y = _y / _w;
 | 
			
		||||
	_z = _z / _w;
 | 
			
		||||
@ -293,4 +346,9 @@ void Vertex::Copy(const Vertex& other)
 | 
			
		||||
	_b = other.GetB();
 | 
			
		||||
 | 
			
		||||
	_uvIndex = other.GetUVIndex();
 | 
			
		||||
 | 
			
		||||
	_zOriginal = other.GetZOriginal();
 | 
			
		||||
	_uOverZ = other.GetUOverZ();
 | 
			
		||||
	_vOverZ = other.GetVOverZ();
 | 
			
		||||
	_zRecip = other.GetZRecip();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								Vertex.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								Vertex.h
									
									
									
									
									
								
							@ -44,6 +44,14 @@ public:
 | 
			
		||||
	int GetUVIndex() const;
 | 
			
		||||
	void SetUVIndex(const int index);
 | 
			
		||||
 | 
			
		||||
	float GetZOriginal() const;
 | 
			
		||||
	float GetUOverZ() const;	
 | 
			
		||||
	void SetUOverZ(const float value);
 | 
			
		||||
	float GetVOverZ() const;	
 | 
			
		||||
	void SetVOverZ(const float value);
 | 
			
		||||
	float GetZRecip() const;
 | 
			
		||||
	void UVCorrect(float u, float v);
 | 
			
		||||
 | 
			
		||||
	// Accessors for returning the private x, y, z and w values as integeres instead of floats
 | 
			
		||||
	// the ceil function to round the number up by defaults but using providing a false param will
 | 
			
		||||
	// use the floor function instead to round the number down
 | 
			
		||||
@ -79,6 +87,10 @@ private:
 | 
			
		||||
 | 
			
		||||
	int _uvIndex;
 | 
			
		||||
 | 
			
		||||
	float _uOverZ;
 | 
			
		||||
	float _vOverZ;
 | 
			
		||||
	float _zRecip;
 | 
			
		||||
 | 
			
		||||
	void Copy(const Vertex& other);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								model_data/uvcheck.pcx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								model_data/uvcheck.pcx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user