Cogs.Core
SwathBuildMeshTask.h
1#pragma once
2#include "Resources/Resources.h"
3#include "Services/Variables.h"
4#include "../Systems/DataSetSystem.h"
5
6#include "../SwathPathResamplingPositions.h"
7
8#include "Foundation/Memory/MemoryBuffer.h"
9
10#include <vector>
11
12namespace Cogs
13{
14 namespace Core
15 {
16 namespace EchoSounder
17 {
18 struct BeamGroupComponent;
19
21 {
22 public:
25 const uint32_t chunkIndex,
26 const float pathSpacing,
27 const float beamSpacing,
28 const BeamGroupComponent& groupComp,
29 const DataSetData& dataData,
30 const SwathPathResamplingPositions& resPos,
31 const SwathPathChunks& chunks
32 )
33 : context(context),
34 mesh(mesh),
35 chunkIndex(chunkIndex),
36 pathSpacing(pathSpacing),
37 beamSpacing(beamSpacing),
38 bufferCapacity(dataData.persistent->config.capacity),
39 maxBeamUpsample(context->variables->get("echo.maxBeamUpsample")->getFloat()),
40 coordSys(dataData.persistent->config.coordSys)
41 {
42 const auto & dataConf = dataData.persistent->config;
43 const auto & buffer = dataData.persistent->buffer;
44
45 // Set up beam subset.
46 assert(groupComp.majorCount == 1);
47 assert(groupComp.minorCount > 0);
48
49 beamCount = std::max(2u, groupComp.minorCount);
50 directionX.resize(beamCount);
51 directionY.resize(beamCount);
52
53 beams = groupComp.beams;
54
55 if (groupComp.minorCount == 1) { // Single-beam data, extrude.
56 const uint32_t ix = beams.back();
57 beams.push_back(ix);
58
59 bool yXpand = true; // Should be the direction mostly across vessel dir.
60
61 const auto sx = yXpand ? 0.f : 0.5f*dataConf.beamWidthX[ix];
62 const auto sy = yXpand ? 0.5f*dataConf.beamWidthY[ix] : 0.f;
63
64 directionX[0] = dataConf.directionX[ix] - sx;
65 directionY[0] = dataConf.directionY[ix] - sy;
66
67 directionX[1] = dataConf.directionX[ix] + sx;
68 directionY[1] = dataConf.directionY[ix] + sy;
69 }
70
71 else { // Multi-beam fan
72
73 for (uint32_t k = 0; k < beamCount; k++) {
74 const auto ix = beams[k];
75 directionX[k] = dataConf.directionX[ix];
76 directionY[k] = dataConf.directionY[ix];
77 }
78 }
79
80 // Copy setup for beam-subset x pings in our support
81 const auto chunk = chunks.getChunks()[chunkIndex];
82 tail = (chunk.flags & SwathPathChunkFlag::Tail) != 0;
83 head = (chunk.flags & SwathPathChunkFlag::Head) != 0;
84
85 const auto & resamplingPositions_src = resPos.getEntries();
86 bix_a = resamplingPositions_src[chunk.support.a].bufferIndex;
87 bix_b = resamplingPositions_src[chunk.support.b].bufferIndex;
88 sliceA = (chunk.extent.a - chunk.support.a);
89 sliceB = (chunk.extent.b - chunk.support.a);
90
91 //std::cerr << "Chunk " << chunkIndex << " geometry, extent={"
92 // << chunk.extent.a << ", " << chunk.extent.b << "}, buffer extent={"
93 // << resamplingPositions_src[chunk.extent.a].bufferIndex
94 // << ", " << resamplingPositions_src[chunk.extent.b].bufferIndex << "}\n";
95
96 sliceCount = (bix_b - bix_a + 1 + dataConf.capacity) % dataConf.capacity;
97 if (pathSpacing != 0.f) { // No resampling along path
98
99 sliceCount = sliceCount + 1; // One extra sample to accommodate linear interpolation.
100
101 resamplingPositions.resize(chunk.support.b - chunk.support.a + 1);
102 for (uint32_t i = 0; i < resamplingPositions.size(); i++) {
103 resamplingPositions[i] = resamplingPositions_src[chunk.support.a + i];
104 }
105 assert(sliceA <= resamplingPositions.size());
106 assert(sliceB <= resamplingPositions.size());
107 }
108 else {
109 assert(sliceA <= sliceCount);
110 assert(sliceB <= sliceCount);
111 }
112
113 metaPings.resize(sliceCount);
114 for (uint32_t i = 0; i < sliceCount; i++) {
115 uint32_t k = (bix_a + i) % dataConf.capacity;
116 metaPings[i] = buffer.metaPings[k];
117 }
118
119 }
120
121
123 : context(other.context),
124 pathSpacing(other.pathSpacing),
125 beamSpacing(other.beamSpacing),
126 chunkIndex(other.chunkIndex),
127 bufferCapacity(other.bufferCapacity),
128 beamCount(other.beamCount),
129 sliceCount(other.sliceCount),
130 sliceA(other.sliceA),
131 sliceB(other.sliceB),
132 mesh(other.mesh),
133 beams(other.beams),
134 coordSys(other.coordSys),
135 directionX(other.directionX),
136 directionY(other.directionY),
137 maxBeamUpsample(other.maxBeamUpsample),
138 tail(other.tail),
139 head(other.head)
140 {
141 resamplingPositions.copy(other.resamplingPositions);
142 metaPings.copy(other.metaPings);
143 }
144
145 protected:
146 Cogs::Core::Context* context;
148 const uint32_t chunkIndex;
149 const uint32_t bufferCapacity;
150 const float pathSpacing;
151 const float beamSpacing;
152 const float maxBeamUpsample;
153 bool tail;
154 bool head;
155
156 uint32_t beamCount;
157 uint32_t sliceCount;
158 uint32_t bix_a;
159 uint32_t bix_b;
160 uint32_t sliceA;
161 uint32_t sliceB;
162
163 std::vector<uint32_t> beams;
164 const uint32_t coordSys;
165 std::vector<float> directionX;
166 std::vector<float> directionY;
167
170 };
171
172 }
173 }
174}
175
176
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
std::unique_ptr< class Variables > variables
Variables service instance.
Definition: Context.h:180
Contains all Cogs related functionality.
Definition: FieldSetter.h:23