diff --git a/Faceball2030/main.cpp b/Faceball2030/main.cpp index bcd89df..dd0d88f 100644 --- a/Faceball2030/main.cpp +++ b/Faceball2030/main.cpp @@ -36,8 +36,8 @@ void FaceBall::LoadLevel(int level) std::vectorrow; for (int x = 0; x < MAP_SIZE.x; x++) { row.push_back({}); - mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y}},{{0,0},{0,1},{1,0}},BLUE }); - mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y + 1}},{{1,0},{0,1},{1,1}},BLUE }); + mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y}},{{0,0},{0,1},{1,0}},{BLUE,BLUE,BLUE} }); + mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y},{(float)x,0,(float)y + 1},{(float)x + 1,0,(float)y + 1}},{{1,0},{0,1},{1,1}},{BLUE,BLUE,BLUE} }); } map.push_back(row); } @@ -58,20 +58,20 @@ void FaceBall::LoadLevel(int level) } AddWall(wallData, { x,y }); if (map[y][x].wallN != NULL) { - mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,0,(float)y},{(float)x + 1,1,(float)y}},{{0,0},{0,1},{1,0}},YELLOW }); - mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x + 1,0,(float)y},{(float)x + 1,1,(float)y}},{{0,1},{1,1},{1,0}},YELLOW }); + mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,0,(float)y},{(float)x + 1,1,(float)y}},{{0,0},{0,1},{1,0}},{YELLOW,YELLOW,YELLOW} }); + mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x + 1,0,(float)y},{(float)x + 1,1,(float)y}},{{0,1},{1,1},{1,0}},{YELLOW,YELLOW,YELLOW} }); } if (map[y][x].wallS != NULL) { - mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y + 1},{(float)x,0,(float)y + 1},{(float)x,1,(float)y + 1}},{{0,0},{1,1},{1,0}},DARK_RED }); - mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y + 1},{(float)x + 1,0,(float)y + 1},{(float)x,0,(float)y + 1}},{{0,0},{0,1},{1,1}},DARK_RED }); + mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y + 1},{(float)x,0,(float)y + 1},{(float)x,1,(float)y + 1}},{{0,0},{1,1},{1,0}},{DARK_RED,DARK_RED,DARK_RED} }); + mapMesh.tris.push_back({ {{(float)x + 1,1,(float)y + 1},{(float)x + 1,0,(float)y + 1},{(float)x,0,(float)y + 1}},{{0,0},{0,1},{1,1}},{DARK_RED,DARK_RED,DARK_RED} }); } if (map[y][x].wallW != NULL) { - mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,1,(float)y + 1}, {(float)x,0,(float)y + 1}},{{1,0},{0,0},{0,1}},MAGENTA }); - mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,1,(float)y}, {(float)x,0,(float)y + 1}}, {{1,1},{1,0},{0,1}},MAGENTA }); + mapMesh.tris.push_back({ {{(float)x,1,(float)y},{(float)x,1,(float)y + 1}, {(float)x,0,(float)y + 1}},{{1,0},{0,0},{0,1}},{MAGENTA,MAGENTA,MAGENTA} }); + mapMesh.tris.push_back({ {{(float)x,0,(float)y},{(float)x,1,(float)y}, {(float)x,0,(float)y + 1}}, {{1,1},{1,0},{0,1}},{MAGENTA,MAGENTA,MAGENTA} }); } if (map[y][x].wallE != NULL) { - mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1},{(float)x + 1,1,(float)y + 1},{(float)x + 1,1,(float)y}},{{1,1},{1,0},{0,0}},CYAN }); - mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1} ,{(float)x + 1,1,(float)y},{(float)x + 1,0,(float)y}},{{1,1},{0,0},{0,1}},CYAN }); + mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1},{(float)x + 1,1,(float)y + 1},{(float)x + 1,1,(float)y}},{{1,1},{1,0},{0,0}},{CYAN,CYAN,CYAN} }); + mapMesh.tris.push_back({ {{(float)x + 1,0,(float)y + 1} ,{(float)x + 1,1,(float)y},{(float)x + 1,0,(float)y}},{{1,1},{0,0},{0,1}},{CYAN,CYAN,CYAN} }); } } } @@ -392,7 +392,9 @@ int FaceBall::Triangle_ClipAgainstPlane(vec3d plane_p, vec3d plane_n, Triangle& // the plane, the triangle simply becomes a smaller triangle // Copy appearance info to new triangle - out_tri1.col = in_tri.col; + out_tri1.col[0] = in_tri.col[0]; + out_tri1.col[1] = in_tri.col[1]; + out_tri1.col[2] = in_tri.col[2]; out_tri1.tex = in_tri.tex; // The inside point is valid, so keep that... @@ -422,8 +424,12 @@ int FaceBall::Triangle_ClipAgainstPlane(vec3d plane_p, vec3d plane_n, Triangle& // represent a quad with two new triangles // Copy appearance info to new triangles - out_tri1.col = in_tri.col; - out_tri2.col = in_tri.col; + out_tri1.col[0] = in_tri.col[0]; + out_tri2.col[0] = in_tri.col[0]; + out_tri1.col[1] = in_tri.col[1]; + out_tri2.col[1] = in_tri.col[1]; + out_tri1.col[2] = in_tri.col[2]; + out_tri2.col[2] = in_tri.col[2]; out_tri1.tex = in_tri.tex; out_tri2.tex = in_tri.tex; @@ -471,7 +477,9 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRas triTransformed.uv[0] = tri.uv[0]; triTransformed.uv[1] = tri.uv[1]; triTransformed.uv[2] = tri.uv[2]; - triTransformed.col = tri.col; + triTransformed.col[0] = tri.col[0]; + triTransformed.col[1] = tri.col[1]; + triTransformed.col[2] = tri.col[2]; vec3d normal, line1, line2; line1 = Vector_Sub(triTransformed.p[1], triTransformed.p[0]); @@ -494,10 +502,30 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRas 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); + triViewed.col[0] = Pixel(triTransformed.col[0].r * dp * dp, triTransformed.col[0].g * dp * dp, triTransformed.col[0].b * dp * dp); + triViewed.col[1] = Pixel(triTransformed.col[1].r * dp * dp, triTransformed.col[1].g * dp * dp, triTransformed.col[1].b * dp * dp); + triViewed.col[2] = Pixel(triTransformed.col[2].r * dp * dp, triTransformed.col[2].g * dp * dp, triTransformed.col[2].b * dp * dp); float dist = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[0].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[0].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[0].z, 2)); + float dist2 = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[1].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[1].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[1].z, 2)); + float dist3 = std::sqrtf(std::powf((freeRoam ? freeRoamCamera : player.GetPos()).x - triTransformed.p[2].x, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).y - triTransformed.p[2].y, 2) + std::powf((freeRoam ? freeRoamCamera : player.GetPos()).z - triTransformed.p[2].z, 2)); float colorMult = dist > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist + PI / 2); - triViewed.col = Pixel(triViewed.col.r * colorMult, triViewed.col.g * colorMult, triViewed.col.b * colorMult); + float colorMult2 = dist2 > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist2 + PI / 2); + float colorMult3 = dist3 > 5 * PI / 3 ? 0 : std::sinf(0.3 * dist3 + PI / 2); + triViewed.col[0] = Pixel(triViewed.col[0].r * colorMult, triViewed.col[0].g * colorMult, triViewed.col[0].b * colorMult); + triViewed.col[1] = Pixel(triViewed.col[1].r * colorMult2, triViewed.col[1].g * colorMult2, triViewed.col[1].b * colorMult2); + triViewed.col[2] = Pixel(triViewed.col[2].r * colorMult3, triViewed.col[2].g * colorMult3, triViewed.col[2].b * colorMult3); + + for (Bullet& b : bullets) { + float dist = std::sqrtf(std::powf(b.pos.x - triTransformed.p[0].x, 2) + std::powf(b.pos.y - triTransformed.p[0].y, 2) + std::powf(b.pos.z - triTransformed.p[0].z, 2)); + float dist2 = std::sqrtf(std::powf(b.pos.x - triTransformed.p[1].x, 2) + std::powf(b.pos.y - triTransformed.p[1].y, 2) + std::powf(b.pos.z - triTransformed.p[1].z, 2)); + float dist3 = std::sqrtf(std::powf(b.pos.x - triTransformed.p[2].x, 2) + std::powf(b.pos.y - triTransformed.p[2].y, 2) + std::powf(b.pos.z - triTransformed.p[2].z, 2)); + float colorMult = (dist < 1 ? std::sinf(1.5 * dist + PI / 2):1); + float colorMult2 = (dist2 < 1 ? std::sinf(1.5 * dist2 + PI / 2) : 1); + float colorMult3 = (dist3 < 1 ? std::sinf(1.5 * dist3 + PI / 2) : 1); + triViewed.col[0] = Pixel(std::min(255, (int)(triViewed.col[0].r * colorMult)), std::min(255, (int)(triViewed.col[0].g * colorMult)), std::min(255, (int)(triViewed.col[0].b * colorMult))); + triViewed.col[1] = Pixel(std::min(255, (int)(triViewed.col[1].r * colorMult2)), std::min(255, (int)(triViewed.col[1].g * colorMult2)), std::min(255, (int)(triViewed.col[1].b * colorMult2))); + triViewed.col[2] = Pixel(std::min(255, (int)(triViewed.col[2].r * colorMult3)), std::min(255, (int)(triViewed.col[2].g * colorMult3)), std::min(255, (int)(triViewed.col[2].b * colorMult3))); + } //triViewed.col = triTransformed.col; int nClippedTriangles = 0; @@ -509,7 +537,9 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRas 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.col[0] = clipped[n].col[0]; + triProjected.col[1] = clipped[n].col[1]; + triProjected.col[2] = clipped[n].col[2]; triProjected.uv[0] = clipped[n].uv[0]; triProjected.uv[1] = clipped[n].uv[1]; triProjected.uv[2] = clipped[n].uv[2]; @@ -642,7 +672,7 @@ void FaceBall::RenderWorld() { {t.uv[0].u,t.uv[0].v}, {t.uv[1].u,t.uv[1].v}, {t.uv[2].u,t.uv[2].v}, - }, { t.uv[0].w,t.uv[1].w,t.uv[2].w }, { t.p[0].z,t.p[1].z,t.p[2].z }, { t.col,t.col,t.col }); + }, { t.uv[0].w,t.uv[1].w,t.uv[2].w }, { t.p[0].z,t.p[1].z,t.p[2].z }, { t.col[0],t.col[1],t.col[2]}); /*SetDecalMode(DecalMode::WIREFRAME); DrawPolygonDecal(nullptr,{ {t.p[0].x, t.p[0].y}, diff --git a/Faceball2030/main.h b/Faceball2030/main.h index 5e6d19f..d8710c2 100644 --- a/Faceball2030/main.h +++ b/Faceball2030/main.h @@ -57,7 +57,7 @@ struct Triangle { vec3d p[3]; vec2d uv[3]; - Pixel col; + Pixel col[3]; Decal* tex; }; @@ -127,7 +127,7 @@ private: Parse(t2, v2, uv2); Parse(t3, v3, uv3); tris.push_back({ verts[v1 - 1],verts[v2 - 1],verts[v3 - 1], - uvs[uv1 - 1],uvs[uv2 - 1],uvs[uv3 - 1],WHITE }); + uvs[uv1 - 1],uvs[uv2 - 1],uvs[uv3 - 1],{WHITE,WHITE,WHITE} }); } }