-
Notifications
You must be signed in to change notification settings - Fork 2
/
BlockController.cpp
79 lines (64 loc) · 2.91 KB
/
BlockController.cpp
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "BlockController.h"
#include "Metadata.h"
#include "DataManager.h"
#include "FeatureTracker.h"
BlockController::BlockController() {}
BlockController::~BlockController() {
pDataManager->~DataManager();
pFeatureTracker->~FeatureTracker();
}
void BlockController::InitParameters(const Metadata& meta, const vec3i& gridDim, const vec3i& blockIdx) {
initAdjacentBlocks(gridDim, blockIdx);
pDataManager = new DataManager(meta, gridDim, blockIdx);
pDataManager->LoadDataSequence(meta, currentT);
pFeatureTracker = new FeatureTracker(pDataManager->GetBlockDim());
pFeatureTracker->SetTFRes(pDataManager->GetTFRes());
pFeatureTracker->SetTFMap(pDataManager->GetTFMap());
pFeatureTracker->SetDataPtr(pDataManager->GetDataPtr(currentT));
}
void BlockController::TrackForward(const Metadata& meta, const vec3i& gridDim, const vec3i& blockIdx) {
pDataManager->LoadDataSequence(meta, currentT);
pFeatureTracker->SetTFMap(pDataManager->GetTFMap());
pFeatureTracker->ExtractAllFeatures();
pFeatureTracker->TrackFeature(pDataManager->GetDataPtr(currentT), FT_FORWARD, FT_DIRECT);
pFeatureTracker->SaveExtractedFeatures(currentT);
// pDataManager->SaveMaskVolume(pFeatureTracker->GetMaskPtr(), meta, currentT);
// pDataManager->SaveMaskVolumeMpi(pFeatureTracker->GetMaskPtr(), meta, currentT);
}
void BlockController::initAdjacentBlocks(const vec3i& gridDim, const vec3i& blockIdx) {
int px = gridDim.x, py = gridDim.y, pz = gridDim.z;
int x = blockIdx.x, y = blockIdx.y, z = blockIdx.z;
adjacentBlocks[LEFT] = x-1 >= 0 ? px*py*z + px*y + x - 1 : -1;
adjacentBlocks[RIGHT] = x+1 < px ? px*py*z + px*y + x + 1 : -1;
adjacentBlocks[BOTTOM] = y-1 >= 0 ? px*py*z + px*(y-1) + x : -1;
adjacentBlocks[TOP] = y+1 < py ? px*py*z + px*(y+1) + x : -1;
adjacentBlocks[FRONT] = z-1 >= 0 ? px*py*(z-1) + px*y + x : -1;
adjacentBlocks[BACK] = z+1 < pz ? px*py*(z+1) + px*y + x : -1;
}
std::vector<int> BlockController::GetAdjacentBlockIds() {
std::vector<int> indices;
for (auto i = 0; i < adjacentBlocks.size(); ++i) {
if (adjacentBlocks[i] != -1) {
indices.push_back(adjacentBlocks[i]);
}
}
return indices;
}
void BlockController::UpdateConnectivityTree(int currentBlockId, const vec3i& blockIdx) {
connectivityTree.clear();
std::vector<Feature> features = pFeatureTracker->GetFeatures(currentT);
for (const auto& f : features) {
for (auto surface : f.touchedSurfaces) {
int adjacentBlockId = adjacentBlocks[surface];
if (adjacentBlockId == -1) {
continue;
}
Leaf leaf;
leaf.id = f.id;
leaf.root = currentBlockId;
leaf.tip = adjacentBlockId;
leaf.centroid = f.boundaryCtr[surface] + blockDim * blockIdx;
connectivityTree.push_back(leaf);
}
}
}