diff --git a/src/ObjCommon/XModel/Gltf/JsonGltf.h b/src/ObjCommon/XModel/Gltf/JsonGltf.h index 61b013c3..ae206cf5 100644 --- a/src/ObjCommon/XModel/Gltf/JsonGltf.h +++ b/src/ObjCommon/XModel/Gltf/JsonGltf.h @@ -91,11 +91,12 @@ namespace gltf public: std::optional xmodel; std::optional spawnpoint; + std::optional pathnode; std::optional flags; }; - NLOHMANN_DEFINE_TYPE_EXTENSION(JsonNodeExtras, xmodel, spawnpoint, flags); + NLOHMANN_DEFINE_TYPE_EXTENSION(JsonNodeExtras, xmodel, spawnpoint, flags, pathnode); class JsonNode { diff --git a/src/ObjLoading/Game/T6/BSP/BSP.h b/src/ObjLoading/Game/T6/BSP/BSP.h index ef4f5e7b..c545c69a 100644 --- a/src/ObjLoading/Game/T6/BSP/BSP.h +++ b/src/ObjLoading/Game/T6/BSP/BSP.h @@ -108,6 +108,11 @@ namespace BSP BSPSpawnPointType type; }; + struct BSPPathNode + { + vec3_t origin; + }; + struct BSPData { std::string name; @@ -118,6 +123,7 @@ namespace BSP std::vector lights; std::vector spawnpoints; + std::vector pathnodes; }; // BSPGameConstants: diff --git a/src/ObjLoading/Game/T6/BSP/BSPCreator.cpp b/src/ObjLoading/Game/T6/BSP/BSPCreator.cpp index 93a05722..e8d82426 100644 --- a/src/ObjLoading/Game/T6/BSP/BSPCreator.cpp +++ b/src/ObjLoading/Game/T6/BSP/BSPCreator.cpp @@ -586,6 +586,26 @@ namespace return true; } + bool addPathNode_Node(const gltf::JsonNode& node) + { + assert(node.extras); + assert(node.extras->pathnode); + + BSPPathNode pathnode; + + Eigen::Matrix4f nodeMatrix = createNodeMatrix(node); + Eigen::Vector4f position(0, 0, 0, 1.0f); + Eigen::Vector4f transformedPosition = nodeMatrix * position; + pathnode.origin.x = transformedPosition.x(); + pathnode.origin.y = transformedPosition.y(); + pathnode.origin.z = transformedPosition.z(); + RhcToLhcCoordinates(pathnode.origin.v); + + m_bsp->pathnodes.emplace_back(pathnode); + + return true; + } + bool addSpawnPointNode(const gltf::JsonNode& node) { assert(node.extras); @@ -641,6 +661,9 @@ namespace if (m_is_world_gfx && node.extras->spawnpoint) return addSpawnPointNode(node); + + if (m_is_world_gfx && node.extras->pathnode) + return addPathNode_Node(node); } if (node.mesh) diff --git a/src/ObjLoading/Game/T6/BSP/Linker/MapEntsLinker.cpp b/src/ObjLoading/Game/T6/BSP/Linker/MapEntsLinker.cpp index 9ef1efec..062f2fb9 100644 --- a/src/ObjLoading/Game/T6/BSP/Linker/MapEntsLinker.cpp +++ b/src/ObjLoading/Game/T6/BSP/Linker/MapEntsLinker.cpp @@ -116,6 +116,17 @@ namespace } } + void addPathNodesToEntString(BSP::BSPData* bsp, std::string& entityString) + { + for (auto& pathnode : bsp->pathnodes) + { + entityString.append("{\n"); + entityString.append(std::format("\"origin\" \"{}\"\n", BSP::BSPUtil::convertVec3ToString(pathnode.origin))); + entityString.append(std::format("\"classname\" \"{}\"\n", "node_pathnode")); + entityString.append("}\n"); + } + } + constexpr const char* DEFAULT_MAP_ENTS_STRING = R"({ "entities": [ { @@ -167,6 +178,8 @@ namespace BSP addSpawnsToEntString(bsp, entityString); + addPathNodesToEntString(bsp, entityString); + MapEnts* mapEnts = m_memory.Alloc(); mapEnts->name = m_memory.Dup(bsp->bspName.c_str());