1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef PATH_FLOWMAP_HDR
#define PATH_FLOWMAP_HDR
#include <array>
#include <vector>
#include "System/type2.h"
#include "System/float3.h"
#include "System/UnorderedSet.hpp"
struct MoveDef;
class CSolidObject;
class PathFlowMap {
public:
struct FlowCell {
float3 flowVector;
float3 cellCenter; // WS
unsigned int numObjects = 0;
};
static PathFlowMap* GetInstance();
static void FreeInstance(PathFlowMap*);
void Init(unsigned int scalex, unsigned int scalez);
void Kill() {
buffers[fBufferIdx].clear();
buffers[bBufferIdx].clear();
indices[fBufferIdx].clear();
indices[bBufferIdx].clear();
}
void Update();
void AddFlow(const CSolidObject*);
const float3& GetFlowVec(unsigned int hmx, unsigned int hmz) const;
float GetFlowCost(unsigned int x, unsigned int z, const MoveDef&, unsigned int opt) const;
float GetMaxFlow() const { return maxFlow[fBufferIdx]; }
unsigned int GetFrontBufferIdx() const { return fBufferIdx; }
unsigned int GetBackBufferIdx() const { return bBufferIdx; }
const std::vector<FlowCell>& GetFrontBuffer() { return buffers[fBufferIdx]; }
const std::vector<FlowCell>& GetBackBuffer() { return buffers[bBufferIdx]; }
private:
unsigned int GetCellIdx(const CSolidObject*) const;
std::vector<FlowCell> buffers[2];
spring::unordered_set<unsigned int> indices[2];
std::array<float3, 16> pathOptDirs;
unsigned int fBufferIdx = 0;
unsigned int bBufferIdx = 0;
unsigned int xscale = 0, xsize = 0, xfact = 0;
unsigned int zscale = 0, zsize = 0, zfact = 0;
float maxFlow[2] = {0.0f, 0.0f};
};
#endif
|