diff --git a/Data/resources/shaders/.kp3d/map_f.glsl b/Data/resources/shaders/.kp3d/map_f.glsl index cd89da3..60d66b0 100644 --- a/Data/resources/shaders/.kp3d/map_f.glsl +++ b/Data/resources/shaders/.kp3d/map_f.glsl @@ -41,7 +41,7 @@ float dist(vec2 p0, vec2 pf){return sqrt((pf.x-p0.x)*(pf.x-p0.x)+(pf.y-p0.y)*(pf void main() { Light light; - light.position = vec3(5.0, -4.0, 5.0); + light.position = vec3(5.0, 4.0, 5.0); light.diffuse = vec3(1.0, 1.0, 1.0); diff --git a/Data/sandbox-log.txt b/Data/sandbox-log.txt index 47b2766..a3b0b10 100644 --- a/Data/sandbox-log.txt +++ b/Data/sandbox-log.txt @@ -1,20 +1,14 @@ -[08:20:13 PM] Info: Starting... +[10:24:19 PM] Info: Starting... KP3D version 2 =============================== Copyright (C) kpworld.xyz 2018-2024 Contact me! @kp_cftsz -[08:20:13 PM] Info: Initializing SDL -[08:20:13 PM] Info: Initializing OpenGL -[08:20:13 PM] Info: OpenGL version: 4.6.0 NVIDIA 536.23 -[08:20:13 PM] Info: Initializing GLEW -[08:20:13 PM] Info: Initializing SDL_mixer -[08:20:13 PM] Info: Reticulating splines... -[08:20:13 PM] Info: Ready! -[08:20:13 PM] Info: BUILDING SECTOR: 1 -[08:20:13 PM] Info: 1 IS TOUCHING: 5 -[08:20:13 PM] Info: BUILDING SECTOR: 2 -[08:20:13 PM] Info: BUILDING SECTOR: 3 -[08:20:13 PM] Info: BUILDING SECTOR: 4 -[08:20:13 PM] Info: BUILDING SECTOR: 5 +[10:24:19 PM] Info: Initializing SDL +[10:24:20 PM] Info: Initializing OpenGL +[10:24:20 PM] Info: OpenGL version: 4.6.0 NVIDIA 536.23 +[10:24:20 PM] Info: Initializing GLEW +[10:24:20 PM] Info: Initializing SDL_mixer +[10:24:20 PM] Info: Reticulating splines... +[10:24:20 PM] Info: Ready! diff --git a/KP3Dii/ext/src/poly2tri/sweep.cc b/KP3Dii/ext/src/poly2tri/sweep.cc index 6cec379..3841823 100644 --- a/KP3Dii/ext/src/poly2tri/sweep.cc +++ b/KP3Dii/ext/src/poly2tri/sweep.cc @@ -106,6 +106,11 @@ void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node) void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point) { + if (!triangle) + { + return; + } + if (IsEdgeSideOfTriangle(*triangle, ep, eq)) { return; } diff --git a/KP3Dii/src/KP3D_Map.cpp b/KP3Dii/src/KP3D_Map.cpp index fc84681..4859f6a 100644 --- a/KP3Dii/src/KP3D_Map.cpp +++ b/KP3Dii/src/KP3D_Map.cpp @@ -258,7 +258,7 @@ void Map::BuildFlat(Sector& sector, Flat& flat, bool invert) * To do this we perform a similar approach to BuildFlat, but because the walls aren't strictly along one axis we have to * "flatten" them to perform the math to triangulate them. This is done by projecting the 3D points to 2D. */ -void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos_b, bool flip, bool flip_u, bool flip_v, XYf uv_offset) +void Map::BuildQuad(Sector& sector, Flat& flat_top, Flat& flat_bottom, const Texture* texture, Vec3 pos_a, Vec3 pos_b, bool flip, bool flip_u, bool flip_v, XYf uv_offset) { if (!texture) return; @@ -273,7 +273,7 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos std::vector points; points.emplace_back(0.0f); - for (const Vertex3D& v: sector.floor.triangulated_data) + for (const Vertex3D& v: flat_bottom.triangulated_data) { if (!PointInLine(v.position.x, v.position.z, pos_a.x, pos_a.z, pos_b.x, pos_b.z)) continue; @@ -288,9 +288,8 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos points.push_back(mpos); } std::vector top_points; - top_points.emplace_back(Distance({ p4.x, p4.z }, { p1.x, p1.z }), p4.y, 0); - // points.emplace_back(Distance({ p2.x, p2.z }, { p1.x, p1.z }), p2.y, 0); - for (const Vertex3D& v: sector.ceiling.triangulated_data) + //top_points.emplace_back(Distance({ p4.x, p4.z }, { p1.x, p1.z }), p4.y, 0); // This may be re-enabled, BUT + for (const Vertex3D& v: flat_top.triangulated_data) { if (!PointInLine(v.position.x, v.position.z, pos_a.x, pos_a.z, pos_b.x, pos_b.z)) continue; @@ -299,7 +298,7 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos top_points.push_back(mpos); } std::sort(points.begin() + 1, points.end(), [&](Vec3 a, Vec3 b) { return a.x < b.x; }); - std::sort(top_points.begin() + 1, top_points.end(), [&](Vec3 a, Vec3 b) { return a.x > b.x; }); + std::sort(top_points.begin() , top_points.end(), [&](Vec3 a, Vec3 b) { return a.x > b.x; }); // ^^^^ If you do, add +1 to begin() points.insert(points.end(), top_points.begin(), top_points.end()); float angle = atan2({ p4.z - p1.z }, { p4.x - p1.x }); @@ -307,8 +306,6 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos points.erase(unique(points.begin(), points.end()), points.end()); std::vector> holes; // unused for now - // Begin: holes - // End: holes std::vector wall_polygon; for (Vec3& p: points) wall_polygon.emplace_back(p.x, p.y); @@ -323,6 +320,12 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos c2t::Point b = clipper_out.at(i + 1); c2t::Point c = clipper_out.at(i + 2); + if (flip) + { + std::swap(b, c); + } + + float au = a.x * 0.5f, av = a.y * 0.5f; float bu = b.x * 0.5f, bv = b.y * 0.5f; float cu = c.x * 0.5f, cv = c.y * 0.5f; @@ -339,20 +342,32 @@ void Map::BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos Vertex3D vtxb = Vertex3D(fvb, Vec2(bu * tw, bv * th)); Vertex3D vtxc = Vertex3D(fvc, Vec2(cu * tw, cv * th)); if (texture) - m_mesh.AddBatch(texture, {vtxa, vtxb, vtxc}, flip); + m_mesh.AddBatch(texture, {vtxa, vtxb, vtxc}, false); } } void Map::BuildWall(Sector& sector, Wall& wall) { - Vec3 a = {wall.start.x, sector.floor.base_height, wall.start.y}; - Vec3 b = {wall.end.x, sector.ceiling.base_height, wall.end.y}; - BuildQuad(sector, wall.textures[TEX_FRONT], a, b, false, false, false, wall.uv_offset[TEX_FRONT]); + Vec3 a = {wall.start.x, 0.0f, wall.start.y}; + Vec3 b = {wall.end.x, 0.0f, wall.end.y}; + BuildQuad(sector, sector.floor, sector.ceiling, wall.textures[TEX_FRONT], a, b, false, false, false, wall.uv_offset[TEX_FRONT]); + + if (wall.flags & Wall::OPENING) + { + bool flip = sector.floor.base_height > wall.portal->floor.base_height; + bool flip2 = sector.ceiling.base_height < wall.portal->ceiling.base_height; + //if (flip) + // flip2 ^= 1; + //if (og_flip2) + // flip ^= 1; + BuildQuad(sector, sector.floor, wall.portal->floor, wall.textures[TEX_LOWER], a, b, flip, false, false, wall.uv_offset[TEX_LOWER]); + BuildQuad(sector, sector.ceiling, wall.portal->ceiling, wall.textures[TEX_UPPER], a, b, flip2, false, false, wall.uv_offset[TEX_UPPER]); + } } void Map::JoinSectors(Sector& sector) { - //for (Wall& ld: sector.walls) + // "Connect" sectors by splitting up their walls where other sectors intersect for (int i = 0; i < sector.walls.size(); i++) { Wall& ld = sector.walls[i]; @@ -376,25 +391,7 @@ void Map::JoinSectors(Sector& sector) !PosCmp({ l.end.x, 0.0f, l.end.y }, { pos_b.x, 0.0f, pos_b.z }) && !PosCmp({ l.end.x, 0.0f, l.end.y }, { pos_a.x, 0.0f, pos_a.z })) { - KP3D_LOG_INFO("{} IS TOUCHING: {}", sector.id, s.id); - // c2t::Point pl0 = { Distance({l.start.x, l.start.y}, {pos_a.x, pos_a.z}), yb }; - // c2t::Point pl1 = { Distance({l.start.x, l.start.y}, {pos_a.x, pos_a.z}), yt }; - // c2t::Point pl2 = { Distance({l.end.x, l.end.y}, {pos_a.x, pos_a.z}), yt }; - // c2t::Point pl3 = { Distance({l.end.x, l.end.y}, {pos_a.x, pos_a.z}), yb }; - // hole.push_back(pl0); - // hole.push_back(pl1); - // hole.push_back(pl2); - // hole.push_back(pl3); - // m_dots.push_back({ l.start.x, yb, -l.start.y }); - // m_dots.push_back({ l.start.x, yt, -l.start.y }); - // m_dots.push_back({ l.end.x, yt, -l.end.y }); - // m_dots.push_back({ l.end.x, yb, -l.end.y }); - - // Note: l is the joined linedef, ld is the original one leading into this one. - // Whatever I do may need to be adjusted as I create more maps... - - //ld.start.x = l.start.x; - //ld.start.y = l.start.y; + //KP3D_LOG_INFO("{} IS TOUCHING: {}", sector.id, s.id); XYf old_end = ld.end; ld.end.x = l.end.x; ld.end.y = l.end.y; @@ -404,8 +401,9 @@ void Map::JoinSectors(Sector& sector) w1.end.x = l.start.x; w1.end.y = l.start.y; w1.textures[TEX_FRONT] = nullptr; - Wall w2 = w1; - w2.textures[TEX_FRONT] = ld.textures[TEX_FRONT]; + w1.portal = &s; + w1.flags = Wall::OPENING; + Wall w2 = ld; w2.start.x = w1.end.x; w2.start.y = w1.end.y; w2.end.x = old_end.x; @@ -414,11 +412,6 @@ void Map::JoinSectors(Sector& sector) InsertLine(sector.walls, i + 1, w1); InsertLine(sector.walls, i + 2, w2); - //sector.walls.insert(sector.walls.begin() + i, 1, w1); - //i++; - //sector.walls.insert(sector.walls.begin() + i + 1, 1, w2); - //i++; - l.textures[TEX_FRONT] = nullptr; } } @@ -428,6 +421,9 @@ void Map::JoinSectors(Sector& sector) void Map::Init() { + sectors.clear(); + m_mesh.Reset(); + XYf points[7] = { {1, 1 }, {6, 4 }, @@ -470,6 +466,7 @@ void Map::Init() Sector s; s.ceiling.texture = ceil; s.floor.texture = floor; + s.floor.floor = true; s.floor.base_height = floor_height; s.ceiling.base_height = ceil_height; s.id = id; @@ -480,7 +477,7 @@ void Map::Init() { XYf start = points[i]; XYf end = points[(i + 1) % num_points]; - s.walls.push_back(Wall{ {nullptr,wall,nullptr}, {{0, 0}}, start, end, Wall::NO_FLAGS, (uint)i }); + s.walls.push_back(Wall{ {wall,wall,wall}, {{0, 0}}, start, end, Wall::NO_FLAGS, (uint)i }); } sectors.push_back(s); @@ -490,7 +487,8 @@ void Map::Init() build_sector(&tex4, &tex2, &tex2, -1.5f, 4.0f, 2, points2, std::size(points2)); build_sector(&tex4, &tex, &tex2, -1.5f, 4.0f, 3, points3, std::size(points3), true); build_sector(&tex4, &tex, &tex2, -1.0f, 4.0f, 4, points4, std::size(points4), true); - build_sector(&tex3, &tex, &tex2, -0.5f, 3.0f, 5, points5, std::size(points5)); + //build_sector(&tex3, &tex, &tex2, -1.2f, 3.0f, 5, points5, std::size(points5)); + build_sector(&tex3, &tex, &tex2, test_u, test_l, 5, points5, std::size(points5), false); // Build tree for (Sector& sp: sectors) @@ -516,7 +514,7 @@ void Map::Init() // Preproc for (Sector& s : sectors) { - KP3D_LOG_INFO("BUILDING SECTOR: {}", s.id); + // KP3D_LOG_INFO("BUILDING SECTOR: {}", s.id); // Build up "steiner points" for terrain only // We'll do this along a grid for now; it should be noted that this will be expected to be part of the sector data later @@ -543,7 +541,7 @@ void Map::Init() if (bail) continue; - if (s.id == 1) + if (s.id == 1 || s.id == 5) { float yv0 = PerlinNoise2D(steiner_point.x, steiner_point.y, 1.0, 10.0); float yv1 = -PerlinNoise2D(steiner_point.x, steiner_point.y, 0.5, 9.0); @@ -558,10 +556,11 @@ void Map::Init() // Build level geometry BuildFlat(s, s.floor, false); BuildFlat(s, s.ceiling, true); + } + for (Sector& s : sectors) for (Wall& ld : s.walls) BuildWall(s, ld); - } // Go through all of the vertices and align them to a grid (very roughly; might want to revisit this later) #if 0 diff --git a/KP3Dii/src/KP3D_Map.h b/KP3Dii/src/KP3D_Map.h index 39990dd..9fdf956 100644 --- a/KP3Dii/src/KP3D_Map.h +++ b/KP3Dii/src/KP3D_Map.h @@ -16,12 +16,14 @@ enum WallTextureIndex TEX_LOWER }; +struct Sector; + struct Wall { enum Flags: byte { NO_FLAGS, - LD_TOUCHED + OPENING // ... }; @@ -33,6 +35,8 @@ struct Wall byte flags; uint uid; + + Sector* portal = nullptr; }; struct Flat @@ -43,6 +47,7 @@ struct Flat float max_height; std::vector steiner_points; std::vector triangulated_data; + bool floor = false; }; struct Sector @@ -89,7 +94,7 @@ public: ErrCode SaveToFile(const std::string& path); void BuildFlat(Sector& sector, Flat& flat, bool invert); - void BuildQuad(Sector& sector, const Texture* texture, Vec3 pos_a, Vec3 pos_b, bool flip, bool flip_u, bool flip_v, XYf uv_offset); + void BuildQuad(Sector& sector, Flat& flat_top, Flat& flat_bottom, const Texture* texture, Vec3 pos_a, Vec3 pos_b, bool flip, bool flip_u, bool flip_v, XYf uv_offset); void BuildWall(Sector& sector, Wall& wall); void JoinSectors(Sector& sector); @@ -108,6 +113,8 @@ public: bool render_wireframe = true; float texture_scale = 128.0f; + float test_u = -1.5f, test_l = 3.0f; + private: StaticMesh m_mesh; Skybox m_skybox_data; diff --git a/KP3Dii/src/KP3D_StaticMesh.cpp b/KP3Dii/src/KP3D_StaticMesh.cpp index 36defbd..24f3303 100644 --- a/KP3Dii/src/KP3D_StaticMesh.cpp +++ b/KP3Dii/src/KP3D_StaticMesh.cpp @@ -219,7 +219,7 @@ void StaticMesh::Finalize(NormalGenType gen_normals) for (size_t j = 0; j < current.vertex_data.size(); j++) { auto& jv = current.vertex_data[j]; - jv.normal = {0,1,0}; + jv.normal = {0.5,0.5,0.5}; } // The following just generates face normals for each triangle for (size_t j = 0; j < current.vertex_data.size(); j += 3) diff --git a/KP3Dii/src/KP3D_StaticMesh.h b/KP3Dii/src/KP3D_StaticMesh.h index 286e62f..84cacca 100644 --- a/KP3Dii/src/KP3D_StaticMesh.h +++ b/KP3Dii/src/KP3D_StaticMesh.h @@ -58,6 +58,7 @@ struct RenderBatch3D std::vector index_data; GLuint gl_bbo_id = 0; std::vector bone_data; + bool flipped = false; }; enum NormalGenType diff --git a/Sandbox/src/Sandbox.cpp b/Sandbox/src/Sandbox.cpp index 05ffc25..5fbca99 100644 --- a/Sandbox/src/Sandbox.cpp +++ b/Sandbox/src/Sandbox.cpp @@ -54,6 +54,21 @@ void Sandbox::Update() map.Rebuild(kp3d::GEN_SMOOTH_NORMALS); KeyReset(kp3d::KEY_F3); } + if (IsKeyDown(kp3d::KEY_B)) + { + map.Init(); + //map.Rebuild(kp3d::GEN_NORMALS); + //KeyReset(kp3d::KEY_B); + } + + if (IsKeyDown(kp3d::KEY_Y)) + map.test_u += 0.1f; + if (IsKeyDown(kp3d::KEY_H)) + map.test_u -= 0.1f; + if (IsKeyDown(kp3d::KEY_U)) + map.test_l += 0.1f; + if (IsKeyDown(kp3d::KEY_J)) + map.test_l -= 0.1f; // Mouse-look if (IsKeyDown(kp3d::KEY_ESCAPE))