diff --git a/Faceball2030/assets/map/map1.map b/Faceball2030/assets/map/map1.map index 64969c9..d8fb2c4 100644 --- a/Faceball2030/assets/map/map1.map +++ b/Faceball2030/assets/map/map1.map @@ -1,34 +1,38 @@ -8 -4 -32779 +6 +6 +32777 32778 -8200 -8204 -8203 8202 8200 +24584 8204 -40969 -41368 -24576 -8194 -8202 -8202 -25110 +40965 +57753 +24584 +8192 +8192 +16788 8197 8193 8192 -8198 +8194 +8194 +8196 +8193 +2 +24580 8201 -8202 -8202 -8202 -8198 +8204 +8197 +8197 +8351 +8197 8195 -278 -24591 +8198 +277 8195 +8602 +8194 8202 8202 -24590 -24735 +8198 diff --git a/Faceball2030/assets/map/map2.map b/Faceball2030/assets/map/map2.map new file mode 100644 index 0000000..b833b38 --- /dev/null +++ b/Faceball2030/assets/map/map2.map @@ -0,0 +1,27 @@ +5 +5 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 diff --git a/Faceball2030/assets/map/map3.map b/Faceball2030/assets/map/map3.map new file mode 100644 index 0000000..b833b38 --- /dev/null +++ b/Faceball2030/assets/map/map3.map @@ -0,0 +1,27 @@ +5 +5 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 diff --git a/Faceball2030/assets/map/map4.map b/Faceball2030/assets/map/map4.map new file mode 100644 index 0000000..b833b38 --- /dev/null +++ b/Faceball2030/assets/map/map4.map @@ -0,0 +1,27 @@ +5 +5 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 diff --git a/Faceball2030/assets/map/map5.map b/Faceball2030/assets/map/map5.map new file mode 100644 index 0000000..b833b38 --- /dev/null +++ b/Faceball2030/assets/map/map5.map @@ -0,0 +1,27 @@ +5 +5 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 +8192 diff --git a/Faceball2030/main.cpp b/Faceball2030/main.cpp index e16aeee..0654b55 100644 --- a/Faceball2030/main.cpp +++ b/Faceball2030/main.cpp @@ -169,32 +169,40 @@ void FaceBall::LoadLevel(int level) if (vi2d{ x,y } == vi2d{exitCoords.x, exitCoords.y + 1}) { exitWallTex = exit_wall_tex; } - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + if (vi2d{x,y} != exitCoords) { + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + } } if (map[y][x].wallS != NULL) { Decal* exitWallTex = wall_tex; if (vi2d{ x,y } == vi2d{ exitCoords.x, exitCoords.y - 1 }) { exitWallTex = exit_wall_tex; } - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + if (vi2d{ x,y } != exitCoords) { + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + } } if (map[y][x].wallW != NULL) { Decal* exitWallTex = wall_tex; if (vi2d{ x,y } == vi2d{ exitCoords.x+1, exitCoords.y }) { exitWallTex = exit_wall_tex; } - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + if (vi2d{ x,y } != exitCoords) { + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + } } if (map[y][x].wallE != NULL) { Decal* exitWallTex = wall_tex; if (vi2d{ x,y } == vi2d{ exitCoords.x - 1, exitCoords.y }) { exitWallTex = exit_wall_tex; } - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); - mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + if (vi2d{ x,y } != exitCoords) { + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + mapWalls.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}},{WHITE,WHITE,WHITE}, exitWallTex }); + } } } } @@ -589,17 +597,18 @@ int FaceBall::Triangle_ClipAgainstPlane(vec3d plane_p, vec3d plane_n, Triangle& } } -void FaceBall::RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b) { +void FaceBall::RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b,bool translucent) { for (auto& tri : b.mesh.tris) { tri.col[0] = b.col; tri.col[1] = b.col; tri.col[2] = b.col; } - RenderMesh(matView, vecTrianglesToRaster, b); + RenderMesh(matView, vecTrianglesToRaster, b,translucent); } -void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRaster, Object&o) { +void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRaster, Object&o,bool translucent) { for (auto& tri : o.mesh.tris) { + if (translucent&&tri.tex != exit_wall_tex && tri.tex != bullet_tex ||!translucent&&(tri.tex==exit_wall_tex || tri.tex == bullet_tex)) { continue; } Triangle triProjected, triTransformed, triViewed; mat4x4 localMat = Matrix_MakeIdentity(); mat4x4 rotMat = Matrix_MakeRotationY(o.rot); @@ -876,6 +885,7 @@ void FaceBall::RenderWorld() { mat4x4 matView = Matrix_QuickInverse(matCamera); std::vectorvecTrianglesToRaster; + std::vectorvecTrianglesToRasterTranslucent; // Draw Triangles for (auto& obj : objects) { @@ -885,13 +895,14 @@ void FaceBall::RenderWorld() { for (Triangle& t : exit.mesh.tris) { t.col[0] = t.col[1] = t.col[2] = {0,(uint8_t)(std::abs(std::sinf(2*PI*gameTimer)) * 255),0}; } - RenderMesh(matView, vecTrianglesToRaster, walls); for (auto& enemy : enemies) { RenderMesh(matView, vecTrianglesToRaster, enemy); } for (auto& bullet : bullets) { - RenderBulletMesh(matView, vecTrianglesToRaster, bullet); + RenderBulletMesh(matView, vecTrianglesToRasterTranslucent, bullet); } + RenderMesh(matView, vecTrianglesToRaster, walls); + RenderMesh(matView, vecTrianglesToRasterTranslucent, walls, true); //std::sort(vecTrianglesToRaster.begin(),vecTrianglesToRaster.end(),[](triangle&t1,triangle&t2){return (t1.p[0].z+t1.p[1].z+t1.p[2].z)/3.0f>(t2.p[0].z+t2.p[1].z+t2.p[2].z)/3.0f;}); ClearBuffer(BLACK, true); @@ -961,6 +972,72 @@ void FaceBall::RenderWorld() { triRenderCount++; } } + std::sort(vecTrianglesToRasterTranslucent.begin(), vecTrianglesToRasterTranslucent.end(), [](Triangle& t1, Triangle& t2) {return (t1.p[0].z + t1.p[1].z + t1.p[2].z) / 3.0f > (t2.p[0].z + t2.p[1].z + t2.p[2].z) / 3.0f; }); + for (auto& triToRaster : vecTrianglesToRasterTranslucent) { + Triangle clipped[2]; + std::listlistTriangles; + listTriangles.push_back(triToRaster); + int nNewTriangles = 1; + + for (int p = 0; p < 4; p++) + { + int nTrisToAdd = 0; + while (nNewTriangles > 0) + { + // Take triangle from front of queue + Triangle test = listTriangles.front(); + listTriangles.pop_front(); + nNewTriangles--; + + // Clip it against a plane. We only need to test each + // subsequent plane, against subsequent new triangles + // as all triangles after a plane clip are guaranteed + // to lie on the inside of the plane. I like how this + // comment is almost completely and utterly justified + switch (p) + { + case 0: nTrisToAdd = Triangle_ClipAgainstPlane({ 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, test, clipped[0], clipped[1]); break; + case 1: nTrisToAdd = Triangle_ClipAgainstPlane({ 0.0f, (float)ScreenHeight() - 1, 0.0f }, { 0.0f, -1.0f, 0.0f }, test, clipped[0], clipped[1]); break; + case 2: nTrisToAdd = Triangle_ClipAgainstPlane({ 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f }, test, clipped[0], clipped[1]); break; + case 3: nTrisToAdd = Triangle_ClipAgainstPlane({ (float)ScreenWidth() - 1, 0.0f, 0.0f }, { -1.0f, 0.0f, 0.0f }, test, clipped[0], clipped[1]); break; + } + + // Clipping may yield a variable number of triangles, so + // add these new ones to the back of the queue for subsequent + // clipping against next planes + for (int w = 0; w < nTrisToAdd; w++) + listTriangles.push_back(clipped[w]); + } + nNewTriangles = listTriangles.size(); + } + + for (auto& t : listTriangles) { + // Rasterize triangle + SetDecalStructure(DecalStructure::LIST); + SetDecalMode(DecalMode::NORMAL); + DrawPolygonDecal(t.tex, { + {t.p[0].x, t.p[0].y}, + {t.p[1].x, t.p[1].y}, + {t.p[2].x, t.p[2].y} + }, { + {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[0],t.col[1],t.col[2] }); + /*SetDecalMode(DecalMode::WIREFRAME); + DrawPolygonDecal(nullptr,{ + {t.p[0].x, t.p[0].y}, + {t.p[1].x, t.p[1].y}, + {t.p[2].x, t.p[2].y} + },{ + {0,0}, + {0,0}, + {0,0}, + }, { t.uv[0].w,t.uv[1].w,t.uv[2].w }, { t.p[0].z,t.p[1].z,t.p[2].z }, { BLACK,BLACK,BLACK });*/ + SetDecalStructure(DecalStructure::FAN); + triRenderCount++; + } + } } void FaceBall::HandleKeys(float fElapsedTime) { diff --git a/Faceball2030/main.h b/Faceball2030/main.h index e246174..c0345d5 100644 --- a/Faceball2030/main.h +++ b/Faceball2030/main.h @@ -304,8 +304,8 @@ class FaceBall : public PixelGameEngine void InitializeEnemyData(); void InitializeBulletColors(); void LoadLevel(int level); - void RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b); - void RenderMesh(mat4x4&matView, std::vector&vecTrianglesToRaster,Object&o); + void RenderBulletMesh(mat4x4& matView, std::vector& vecTrianglesToRaster, Bullet& b,bool translucent=true); + void RenderMesh(mat4x4&matView, std::vector&vecTrianglesToRaster,Object&o,bool translucent=false); void RenderMeshDeathScreen(mat4x4& matView, std::vector& vecTrianglesToRaster, Object& o); void RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex); void RenderHud(float fElapsedTime);