|
|
|
@ -48,6 +48,7 @@ struct mesh |
|
|
|
|
{ |
|
|
|
|
std::vector<triangle> tris; |
|
|
|
|
Decal* texture; |
|
|
|
|
float rot=0; |
|
|
|
|
|
|
|
|
|
void Parse(std::string str, int& v, int& uv) { |
|
|
|
|
std::cout << str << "\n"; |
|
|
|
@ -454,15 +455,15 @@ private: |
|
|
|
|
|
|
|
|
|
void RenderWorld() { |
|
|
|
|
// Set up rotation matrices
|
|
|
|
|
mat4x4 matRotZ, matRotX, matTrans, matWorld; |
|
|
|
|
mat4x4 matRotZ, matRotX, matWorld; |
|
|
|
|
|
|
|
|
|
matRotZ = Matrix_MakeRotationZ(fTheta * 0.5f); |
|
|
|
|
matRotX = Matrix_MakeRotationX(fTheta); |
|
|
|
|
|
|
|
|
|
matTrans = Matrix_MakeTranslation(0.0f, 0.0f, 0.0f); |
|
|
|
|
//matTrans = Matrix_MakeTranslation(0.0f, 0.0f, 0.0f);
|
|
|
|
|
matWorld = Matrix_MakeIdentity(); |
|
|
|
|
matWorld = Matrix_MultiplyMatrix(matRotZ, matRotX); |
|
|
|
|
matWorld = Matrix_MultiplyMatrix(matWorld, matTrans); |
|
|
|
|
//matWorld = Matrix_MultiplyMatrix(matWorld, matTrans);
|
|
|
|
|
|
|
|
|
|
vec3d vUp = { 0,1,0 }; |
|
|
|
|
vec3d vTarget = { 0,sinf(pitch),cosf(pitch) }; |
|
|
|
@ -475,91 +476,97 @@ private: |
|
|
|
|
std::vector<triangle>vecTrianglesToRaster; |
|
|
|
|
|
|
|
|
|
// Draw Triangles
|
|
|
|
|
for (auto& tri : mapMesh.tris) |
|
|
|
|
{ |
|
|
|
|
triangle triProjected, triTransformed, triViewed; |
|
|
|
|
|
|
|
|
|
triTransformed.p[0] = Matrix_MultiplyVector(matWorld, tri.p[0]); |
|
|
|
|
triTransformed.p[1] = Matrix_MultiplyVector(matWorld, tri.p[1]); |
|
|
|
|
triTransformed.p[2] = Matrix_MultiplyVector(matWorld, tri.p[2]); |
|
|
|
|
triTransformed.uv[0] = tri.uv[0]; |
|
|
|
|
triTransformed.uv[1] = tri.uv[1]; |
|
|
|
|
triTransformed.uv[2] = tri.uv[2]; |
|
|
|
|
triTransformed.col = tri.col; |
|
|
|
|
|
|
|
|
|
vec3d normal, line1, line2; |
|
|
|
|
line1 = Vector_Sub(triTransformed.p[1], triTransformed.p[0]); |
|
|
|
|
line2 = Vector_Sub(triTransformed.p[2], triTransformed.p[0]); |
|
|
|
|
|
|
|
|
|
normal = Vector_CrossProduct(line1, line2); |
|
|
|
|
normal = Vector_Normalise(normal); |
|
|
|
|
|
|
|
|
|
vec3d vCameraRay = Vector_Sub(triTransformed.p[0], vCamera); |
|
|
|
|
|
|
|
|
|
if (Vector_DotProduct(normal, vCameraRay) < 0) { |
|
|
|
|
vec3d light_dir = Vector_Mul(vLookDir, -1); |
|
|
|
|
light_dir = Vector_Normalise(light_dir); |
|
|
|
|
|
|
|
|
|
float dp = std::max(0.7f, Vector_DotProduct(light_dir, normal)); |
|
|
|
|
|
|
|
|
|
triViewed.p[0] = Matrix_MultiplyVector(matView, triTransformed.p[0]); |
|
|
|
|
triViewed.p[1] = Matrix_MultiplyVector(matView, triTransformed.p[1]); |
|
|
|
|
triViewed.p[2] = Matrix_MultiplyVector(matView, triTransformed.p[2]); |
|
|
|
|
triViewed.uv[0] = triTransformed.uv[0]; |
|
|
|
|
triViewed.uv[1] = triTransformed.uv[1]; |
|
|
|
|
triViewed.uv[2] = triTransformed.uv[2]; |
|
|
|
|
triViewed.col = Pixel(triTransformed.col.r * dp * dp, triTransformed.col.g * dp * dp, triTransformed.col.b * dp * dp); |
|
|
|
|
|
|
|
|
|
int nClippedTriangles = 0; |
|
|
|
|
triangle clipped[2]; |
|
|
|
|
nClippedTriangles = Triangle_ClipAgainstPlane({ 0.0f, 0.0f, 0.1f }, { 0.0f, 0.0f, 1.0f }, triViewed, clipped[0], clipped[1]); |
|
|
|
|
|
|
|
|
|
for (int n = 0; n < nClippedTriangles; n++) { |
|
|
|
|
// Project triangles from 3D --> 2D
|
|
|
|
|
triProjected.p[0] = Matrix_MultiplyVector(matProj, clipped[n].p[0]); |
|
|
|
|
triProjected.p[1] = Matrix_MultiplyVector(matProj, clipped[n].p[1]); |
|
|
|
|
triProjected.p[2] = Matrix_MultiplyVector(matProj, clipped[n].p[2]); |
|
|
|
|
triProjected.col = clipped[n].col; |
|
|
|
|
triProjected.uv[0] = clipped[n].uv[0]; |
|
|
|
|
triProjected.uv[1] = clipped[n].uv[1]; |
|
|
|
|
triProjected.uv[2] = clipped[n].uv[2]; |
|
|
|
|
triProjected.uv[0].u = triProjected.uv[0].u / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].u = triProjected.uv[1].u / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].u = triProjected.uv[2].u / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].v = triProjected.uv[0].v / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].v = triProjected.uv[1].v / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].v = triProjected.uv[2].v / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].w = 1.0f / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].w = 1.0f / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].w = 1.0f / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
triProjected.p[0] = Vector_Div(triProjected.p[0], triProjected.p[0].w); |
|
|
|
|
triProjected.p[1] = Vector_Div(triProjected.p[1], triProjected.p[1].w); |
|
|
|
|
triProjected.p[2] = Vector_Div(triProjected.p[2], triProjected.p[2].w); |
|
|
|
|
|
|
|
|
|
triProjected.p[0].x *= -1.0f; |
|
|
|
|
triProjected.p[1].x *= -1.0f; |
|
|
|
|
triProjected.p[2].x *= -1.0f; |
|
|
|
|
triProjected.p[0].y *= -1.0f; |
|
|
|
|
triProjected.p[1].y *= -1.0f; |
|
|
|
|
triProjected.p[2].y *= -1.0f; |
|
|
|
|
|
|
|
|
|
// Scale into view
|
|
|
|
|
vec3d vOffsetView = { 1,1,0 }; |
|
|
|
|
triProjected.p[0] = Vector_Add(triProjected.p[0], vOffsetView); |
|
|
|
|
triProjected.p[1] = Vector_Add(triProjected.p[1], vOffsetView); |
|
|
|
|
triProjected.p[2] = Vector_Add(triProjected.p[2], vOffsetView); |
|
|
|
|
triProjected.p[0].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[0].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[1].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[1].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[2].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[2].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
|
|
|
|
|
vecTrianglesToRaster.push_back(triProjected); |
|
|
|
|
for (auto& mesh : objects) { |
|
|
|
|
for (auto& tri : mesh.tris){ |
|
|
|
|
triangle triProjected, triTransformed, triViewed; |
|
|
|
|
mat4x4 matTrans = Matrix_MakeTranslation(-MAP_SIZE.x/2, 0, -MAP_SIZE.y/2); |
|
|
|
|
mat4x4 localMat = Matrix_MakeIdentity(); |
|
|
|
|
localMat = Matrix_MultiplyMatrix(localMat, matTrans); |
|
|
|
|
mat4x4 rotMat = Matrix_MakeRotationY(mesh.rot); |
|
|
|
|
localMat = Matrix_MultiplyMatrix(localMat, rotMat); |
|
|
|
|
|
|
|
|
|
triTransformed.p[0] = Matrix_MultiplyVector(localMat, tri.p[0]); |
|
|
|
|
triTransformed.p[1] = Matrix_MultiplyVector(localMat, tri.p[1]); |
|
|
|
|
triTransformed.p[2] = Matrix_MultiplyVector(localMat, tri.p[2]); |
|
|
|
|
triTransformed.uv[0] = tri.uv[0]; |
|
|
|
|
triTransformed.uv[1] = tri.uv[1]; |
|
|
|
|
triTransformed.uv[2] = tri.uv[2]; |
|
|
|
|
triTransformed.col = tri.col; |
|
|
|
|
|
|
|
|
|
vec3d normal, line1, line2; |
|
|
|
|
line1 = Vector_Sub(triTransformed.p[1], triTransformed.p[0]); |
|
|
|
|
line2 = Vector_Sub(triTransformed.p[2], triTransformed.p[0]); |
|
|
|
|
|
|
|
|
|
normal = Vector_CrossProduct(line1, line2); |
|
|
|
|
normal = Vector_Normalise(normal); |
|
|
|
|
|
|
|
|
|
vec3d vCameraRay = Vector_Sub(triTransformed.p[0], vCamera); |
|
|
|
|
|
|
|
|
|
if (Vector_DotProduct(normal, vCameraRay) < 0) { |
|
|
|
|
vec3d light_dir = Vector_Mul(vLookDir, -1); |
|
|
|
|
light_dir = Vector_Normalise(light_dir); |
|
|
|
|
|
|
|
|
|
float dp = std::max(0.7f, Vector_DotProduct(light_dir, normal)); |
|
|
|
|
|
|
|
|
|
triViewed.p[0] = Matrix_MultiplyVector(matView, triTransformed.p[0]); |
|
|
|
|
triViewed.p[1] = Matrix_MultiplyVector(matView, triTransformed.p[1]); |
|
|
|
|
triViewed.p[2] = Matrix_MultiplyVector(matView, triTransformed.p[2]); |
|
|
|
|
triViewed.uv[0] = triTransformed.uv[0]; |
|
|
|
|
triViewed.uv[1] = triTransformed.uv[1]; |
|
|
|
|
triViewed.uv[2] = triTransformed.uv[2]; |
|
|
|
|
triViewed.col = Pixel(triTransformed.col.r * dp * dp, triTransformed.col.g * dp * dp, triTransformed.col.b * dp * dp); |
|
|
|
|
|
|
|
|
|
int nClippedTriangles = 0; |
|
|
|
|
triangle clipped[2]; |
|
|
|
|
nClippedTriangles = Triangle_ClipAgainstPlane({ 0.0f, 0.0f, 0.1f }, { 0.0f, 0.0f, 1.0f }, triViewed, clipped[0], clipped[1]); |
|
|
|
|
|
|
|
|
|
for (int n = 0; n < nClippedTriangles; n++) { |
|
|
|
|
// Project triangles from 3D --> 2D
|
|
|
|
|
triProjected.p[0] = Matrix_MultiplyVector(matProj, clipped[n].p[0]); |
|
|
|
|
triProjected.p[1] = Matrix_MultiplyVector(matProj, clipped[n].p[1]); |
|
|
|
|
triProjected.p[2] = Matrix_MultiplyVector(matProj, clipped[n].p[2]); |
|
|
|
|
triProjected.col = clipped[n].col; |
|
|
|
|
triProjected.uv[0] = clipped[n].uv[0]; |
|
|
|
|
triProjected.uv[1] = clipped[n].uv[1]; |
|
|
|
|
triProjected.uv[2] = clipped[n].uv[2]; |
|
|
|
|
triProjected.uv[0].u = triProjected.uv[0].u / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].u = triProjected.uv[1].u / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].u = triProjected.uv[2].u / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].v = triProjected.uv[0].v / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].v = triProjected.uv[1].v / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].v = triProjected.uv[2].v / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
triProjected.uv[0].w = 1.0f / triProjected.p[0].w; |
|
|
|
|
triProjected.uv[1].w = 1.0f / triProjected.p[1].w; |
|
|
|
|
triProjected.uv[2].w = 1.0f / triProjected.p[2].w; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
triProjected.p[0] = Vector_Div(triProjected.p[0], triProjected.p[0].w); |
|
|
|
|
triProjected.p[1] = Vector_Div(triProjected.p[1], triProjected.p[1].w); |
|
|
|
|
triProjected.p[2] = Vector_Div(triProjected.p[2], triProjected.p[2].w); |
|
|
|
|
|
|
|
|
|
triProjected.p[0].x *= -1.0f; |
|
|
|
|
triProjected.p[1].x *= -1.0f; |
|
|
|
|
triProjected.p[2].x *= -1.0f; |
|
|
|
|
triProjected.p[0].y *= -1.0f; |
|
|
|
|
triProjected.p[1].y *= -1.0f; |
|
|
|
|
triProjected.p[2].y *= -1.0f; |
|
|
|
|
|
|
|
|
|
// Scale into view
|
|
|
|
|
vec3d vOffsetView = { 1,1,0 }; |
|
|
|
|
triProjected.p[0] = Vector_Add(triProjected.p[0], vOffsetView); |
|
|
|
|
triProjected.p[1] = Vector_Add(triProjected.p[1], vOffsetView); |
|
|
|
|
triProjected.p[2] = Vector_Add(triProjected.p[2], vOffsetView); |
|
|
|
|
triProjected.p[0].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[0].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[1].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[1].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
triProjected.p[2].x *= 0.5f * (float)ScreenWidth(); |
|
|
|
|
triProjected.p[2].y *= 0.5f * (float)ScreenHeight(); |
|
|
|
|
|
|
|
|
|
vecTrianglesToRaster.push_back(triProjected); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -698,13 +705,14 @@ private: |
|
|
|
|
Decal* dot; |
|
|
|
|
vi2d MAP_SIZE = { 10,10 }; |
|
|
|
|
std::vector<std::vector<MapSquare>>map; |
|
|
|
|
std::vector<mesh>objects; |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
bool OnUserCreate() override |
|
|
|
|
{ |
|
|
|
|
sAppName = "Faceball 2030"; |
|
|
|
|
matProj = Matrix_MakeProjection(90.0f, (float)ScreenHeight() / (float)ScreenWidth(), 0.1f, 1000.0f); |
|
|
|
|
dot = new Decal(new Sprite("dot.png")); |
|
|
|
|
dot = new Decal(new Sprite("assets/dot.png")); |
|
|
|
|
|
|
|
|
|
mapMesh.texture = dot; |
|
|
|
|
|
|
|
|
@ -795,6 +803,8 @@ public: |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
objects.push_back(mapMesh); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|