#include "CPathFindArea.hpp" #include "IVParamObj.hpp" #include "CToken.hpp" namespace urde { CPFAreaOctree::CPFAreaOctree(CMemoryInStream& in) { x0_isLeaf = in.readUint32Big(); x4_aabb.readBoundingBoxBig(in); x1c_center.readBig(in); for (int i=0 ; i<8 ; ++i) x28_children[i] = reinterpret_cast(in.readUint32Big()); x48_regions.set_size(in.readUint32Big()); x48_regions.set_data(reinterpret_cast(in.readUint32Big())); } void CPFAreaOctree::Fixup(CPFArea& area) { x0_isLeaf = x0_isLeaf != 0 ? 1 : 0; if (x0_isLeaf) { if (x48_regions.empty()) return; x48_regions.set_data(&area.x160_octreeRegionLookup[reinterpret_cast(x48_regions.data())]); return; } for (int i=0 ; i<8 ; ++i) { if ((reinterpret_cast(x28_children[i]) & 0x80000000) == 0) x28_children[i] = &area.x158_octree[reinterpret_cast(x28_children[i])]; else x28_children[i] = nullptr; } } int CPFAreaOctree::GetChildIndex(const zeus::CVector3f& point) const { int idx = 0x0; if (point.x > x1c_center.x) idx = 0x1; if (point.y > x1c_center.y) idx |= 0x2; if (point.z > x1c_center.z) idx |= 0x4; return idx; } CPFOpenList::CPFOpenList() { } void CPFOpenList::Clear() { } CPFArea::CPFArea(std::unique_ptr&& buf, u32 len) { CMemoryInStream r(buf.get(), len); u32 numNodes = r.readUint32Big(); x140_nodes.reserve(numNodes); for (u32 i=0 ; i(r.readUint32Big())); for (CPFRegion*& rl : x160_octreeRegionLookup) rl = &x150_regions[reinterpret_cast(rl)]; u32 numOctreeNodes = r.readUint32Big(); x158_octree.reserve(numOctreeNodes); for (u32 i=0 ; iGetIndex(); u32 i2 = r2->GetIndex(); if (i1 > i2) std::swap(i1, i2); u32 remRegions = u32(x150_regions.size()) - i1; u32 remConnections = remRegions * (remRegions - 1) / 2; u32 totalConnections = u32(x150_regions.size()) * (u32(x150_regions.size()) - 1) / 2; u32 bit = totalConnections - remConnections + i2 - (i1 + 1); auto d = std::div(bit, 32); if ((flags & 0x2) != 0) return ((x170_connectionsFlyers[d.quot] >> d.rem) & 0x1) == 0x1; else return ((x168_connectionsGround[d.quot] >> d.rem) & 0x1) == 0x1; } CFactoryFnReturn FPathFindAreaFactory(const urde::SObjectTag& tag, std::unique_ptr&& in, u32 len, const urde::CVParamTransfer& vparms, CObjectReference* selfRef) { return TToken::GetIObjObjectFor(std::make_unique(std::move(in), len)); } }