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(50, 50, 50));
|
||||||
_lights.push_back(new AmbientLight(255, 255, 255));
|
//_lights.push_back(new AmbientLight(255, 255, 255));
|
||||||
//_lights.push_back(new DirectionalLight(Vector3D(-1, 0, 0), 150, 150, 150));
|
_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));
|
//_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)));
|
_cameras.push_back(Camera(0.0f, 0.0f, 0.0f, Vertex(0.0f, 0.0f, -50.0f)));
|
||||||
|
|
||||||
_screenMinimized = false;
|
_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)
|
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)
|
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);
|
return Lerp((float)a, (float)b, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int toDraw = 1;
|
||||||
|
int drawn = 0;
|
||||||
|
|
||||||
void Rasteriser::Update(const Bitmap& bitmap)
|
void Rasteriser::Update(const Bitmap& bitmap)
|
||||||
{
|
{
|
||||||
|
drawn = 0;
|
||||||
if (bitmap.GetWidth() == 0 || bitmap.GetHeight() == 0)
|
if (bitmap.GetWidth() == 0 || bitmap.GetHeight() == 0)
|
||||||
{
|
{
|
||||||
_screenMinimized = true;
|
_screenMinimized = true;
|
||||||
@ -153,7 +157,7 @@ void Rasteriser::Update(const Bitmap& bitmap)
|
|||||||
|
|
||||||
if (!_screenMinimized)
|
if (!_screenMinimized)
|
||||||
{
|
{
|
||||||
int currentRot = (_rotation % 360);
|
int currentRot = 0;// 45; // (_rotation % 360);
|
||||||
Vertex startPos = Vertex(0, 0, 20);
|
Vertex startPos = Vertex(0, 0, 20);
|
||||||
int currentZOff = 0;
|
int currentZOff = 0;
|
||||||
int currentModelIndex = 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);
|
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));
|
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[0], verts[1], temp);
|
||||||
FillGouraudSideTriangle(hDc, verts[2], 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())
|
if (tempA.GetX() < tempB.GetX())
|
||||||
{
|
{
|
||||||
leftEndPoint = tempA.GetX() - 1.0f;
|
leftEndPoint = tempA.GetX();
|
||||||
rightEndPoint = tempB.GetX() + 1.0f;
|
rightEndPoint = tempB.GetX() + 1.0f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
leftEndPoint = tempB.GetX() - 1.0f;
|
leftEndPoint = tempB.GetX();
|
||||||
rightEndPoint = tempA.GetX() + 1.0f;
|
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 iRedA = Lerp(v1.GetR(), v2.GetR(), (float)i / (float)dx1);
|
||||||
float iRedB = Lerp(v1.GetR(), v3.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);
|
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 xLength = (int)ceil(rightEndPoint) - (int)ceil(leftEndPoint);
|
||||||
int ci = 0;
|
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 ti = (float)ci / (float)xLength;
|
||||||
float redTmp = Lerp(iRedA, iRedB, ti);
|
float redTmp = Lerp(iRedA, iRedB, ti);
|
||||||
@ -690,22 +705,22 @@ void Rasteriser::FillGouraudSideTriangle(HDC hDc, const Vertex& v1, const Vertex
|
|||||||
{
|
{
|
||||||
if (changed2)
|
if (changed2)
|
||||||
{
|
{
|
||||||
tempB.SetX((float)tempB.GetXInt() + (float)signx2);
|
tempB.SetX((float)tempB.GetX() + (float)signx2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tempB.SetY((float)tempB.GetYInt() + (float)signy2);
|
tempB.SetY((float)tempB.GetY() + (float)signy2);
|
||||||
}
|
}
|
||||||
e2 = e2 - 2 * dx2;
|
e2 = e2 - 2 * dx2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed2)
|
if (changed2)
|
||||||
{
|
{
|
||||||
tempB.SetY((float)tempB.GetYInt() + (float)signy2);
|
tempB.SetY((float)tempB.GetY() + (float)signy2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tempB.SetX((float)tempB.GetXInt() + (float)signx2);
|
tempB.SetX((float)tempB.GetX() + (float)signx2);
|
||||||
}
|
}
|
||||||
e2 = e2 + 2 * dy2;
|
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());
|
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());
|
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 uc0 = 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 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);
|
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());
|
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());
|
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));
|
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());
|
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);
|
{
|
||||||
temp.SetUVIndex(verts[0].GetUVIndex());
|
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);
|
FillTexturedSideTriangle(hDc, model, verts[2], verts[1], temp, model.GetUVCoord(verts[2].GetUVIndex()), model.GetUVCoord(verts[1].GetUVIndex()), tempCoords);
|
||||||
}
|
drawn++;
|
||||||
else
|
}
|
||||||
{
|
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()));
|
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()));
|
||||||
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;
|
dx1 = dy1;
|
||||||
dy1 = tempDx;
|
dy1 = tempDx;
|
||||||
|
|
||||||
int tempDu = du1;
|
|
||||||
du1 = dv1;
|
|
||||||
dv1 = tempDu;
|
|
||||||
|
|
||||||
changed1 = true;
|
changed1 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -811,10 +831,6 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
|
|||||||
dx2 = dy2;
|
dx2 = dy2;
|
||||||
dy2 = tempDx;
|
dy2 = tempDx;
|
||||||
|
|
||||||
int tempDu = du2;
|
|
||||||
du2 = dv2;
|
|
||||||
dv2 = tempDu;
|
|
||||||
|
|
||||||
changed2 = true;
|
changed2 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,27 +841,42 @@ void Rasteriser::FillTexturedSideTriangle(HDC hDc, Model& model, const Vertex& v
|
|||||||
{
|
{
|
||||||
float leftEndPoint;
|
float leftEndPoint;
|
||||||
float rightEndPoint;
|
float rightEndPoint;
|
||||||
float leftUV;
|
float leftU;
|
||||||
float rightUV;
|
float rightU;
|
||||||
|
float leftV;
|
||||||
|
float rightV;
|
||||||
|
|
||||||
if (tempA.GetX() < tempB.GetX())
|
if (tempA.GetX() < tempB.GetX())
|
||||||
{
|
{
|
||||||
leftEndPoint = tempA.GetX() - 1.0f;
|
leftEndPoint = tempA.GetX() - 1.0f;
|
||||||
rightEndPoint = tempB.GetX() + 1.0f;
|
rightEndPoint = tempB.GetX() + 1.0f;
|
||||||
leftUV = tempUVA.GetU();
|
leftU = tempUVA.GetU();
|
||||||
rightUV = tempUVB.GetU();
|
rightU = tempUVB.GetU();
|
||||||
|
leftV = tempUVA.GetV();
|
||||||
|
rightV = tempUVB.GetV();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
leftEndPoint = tempB.GetX() - 1.0f;
|
leftEndPoint = tempB.GetX() - 1.0f;
|
||||||
rightEndPoint = tempA.GetX() + 1.0f;
|
rightEndPoint = tempA.GetX() + 1.0f;
|
||||||
leftUV = tempUVB.GetU();
|
leftU = tempUVB.GetU();
|
||||||
rightUV = tempUVA.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());
|
//x0 + (y - y0) * ((x1 - x0) / (y1 - y0))
|
||||||
float UCoordB = Interpolate(uv1.GetV() + i, uv1.GetU(), uv3.GetU(), uv1.GetV(), uv3.GetV());
|
//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 iRedA = Lerp(v1.GetR(), v2.GetR(), (float)i / (float)dx1);
|
||||||
float iRedB = Lerp(v1.GetR(), v3.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 xLength = (int)ceil(rightEndPoint) - (int)ceil(leftEndPoint);
|
||||||
int ci = 0;
|
int ci = 0;
|
||||||
|
|
||||||
for (int xi = (int)ceil(leftEndPoint); xi <= (int)ceil(rightEndPoint); xi++)
|
if (i < 10000)
|
||||||
{
|
{
|
||||||
float ti = (float)ci / (float)xLength;
|
for (int xi = (int)ceil(leftEndPoint); xi <= (int)ceil(rightEndPoint); xi++)
|
||||||
float UCoordTmp = Lerp(leftUV, rightUV, ti);
|
{
|
||||||
float redTmp = Lerp(iRedA, iRedB, ti) / 100;
|
float ti = (float)ci / (float)xLength;
|
||||||
float greenTmp = Lerp(iGreenA, iGreenB, ti) / 100;
|
float UCoordTmp = Lerp(UCoordA, UCoordB, ti);
|
||||||
float blueTmp = Lerp(iBlueA, iBlueB, ti) / 100;
|
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 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)));
|
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);
|
SetPixel(hDc, xi, tempA.GetYInt(), currentColor);
|
||||||
ci++;
|
ci++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
60
Vertex.cpp
60
Vertex.cpp
@ -11,6 +11,11 @@ Vertex::Vertex()
|
|||||||
_r = 0;
|
_r = 0;
|
||||||
_g = 0;
|
_g = 0;
|
||||||
_b = 0;
|
_b = 0;
|
||||||
|
_uvIndex = -1;
|
||||||
|
_zOriginal = 0;
|
||||||
|
_uOverZ = 0;
|
||||||
|
_vOverZ = 0;
|
||||||
|
_zRecip = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vertex::Vertex(const float x, const float y, const float z)
|
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;
|
_r = 0;
|
||||||
_g = 0;
|
_g = 0;
|
||||||
_b = 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)
|
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;
|
_r = 0;
|
||||||
_g = 0;
|
_g = 0;
|
||||||
_b = 0;
|
_b = 0;
|
||||||
|
_uvIndex = -1;
|
||||||
|
_zOriginal = 0;
|
||||||
|
_uOverZ = 0;
|
||||||
|
_vOverZ = 0;
|
||||||
|
_zRecip = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vertex::Vertex(const Vertex & other)
|
Vertex::Vertex(const Vertex & other)
|
||||||
@ -187,6 +202,44 @@ void Vertex::SetUVIndex(const int index)
|
|||||||
_uvIndex = 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
|
int Vertex::GetXInt(bool forceRoundUp) const
|
||||||
{
|
{
|
||||||
if (forceRoundUp)
|
if (forceRoundUp)
|
||||||
@ -236,7 +289,7 @@ int Vertex::GetWInt(bool forceRoundUp) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Vertex::Dehomogenize()
|
void Vertex::Dehomogenize()
|
||||||
{
|
{
|
||||||
_x = _x / _w;
|
_x = _x / _w;
|
||||||
_y = _y / _w;
|
_y = _y / _w;
|
||||||
_z = _z / _w;
|
_z = _z / _w;
|
||||||
@ -293,4 +346,9 @@ void Vertex::Copy(const Vertex& other)
|
|||||||
_b = other.GetB();
|
_b = other.GetB();
|
||||||
|
|
||||||
_uvIndex = other.GetUVIndex();
|
_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;
|
int GetUVIndex() const;
|
||||||
void SetUVIndex(const int index);
|
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
|
// 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
|
// 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
|
// use the floor function instead to round the number down
|
||||||
@ -79,6 +87,10 @@ private:
|
|||||||
|
|
||||||
int _uvIndex;
|
int _uvIndex;
|
||||||
|
|
||||||
|
float _uOverZ;
|
||||||
|
float _vOverZ;
|
||||||
|
float _zRecip;
|
||||||
|
|
||||||
void Copy(const Vertex& other);
|
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