Cogs.Core
OctDummyProviderSystem.cpp
1#include "Context.h"
2#include "ExtensionRegistry.h"
3#include "Services/TaskManager.h"
4#include "Components/Geometry/MarkerPointSetComponent.h"
5
6#include "OctSystem.h"
7#include "OctDummyProviderSystem.h"
8
9#include "Foundation/Logging/Logger.h"
10
11namespace {
12 using namespace Cogs::Core;
13
15
16
17 struct OctDummySubTask
18 {
19 std::shared_ptr<Volumetric::OctDummyPersistent> persistent;
20 size_t index;
21
22 void operator()()
23 {
24 auto & res = persistent->responses[index];
25
26 const auto & min = res->min;
27 const auto & max = res->max;
28 const auto & N = res->N;
29 auto & data = res->data0;
30 data.resize(N.x*N.y*N.z);
31
32 glm::vec3 s(1.f / N.x,
33 1.f / N.y,
34 1.f / N.z);
35
37 v.resize(N.x*N.y*N.z);
38
39 std::vector<glm::vec3> Q;
40 Q.reserve(res->regionKeys.size());
41 for (const auto regionKey : res->regionKeys) {
42 Q.push_back(persistent->positions[regionKey]);
43 }
44
45 const auto r2 = persistent->radius * persistent->radius;
46 for (unsigned k = 0; k < N.z; k++) {
47 for (unsigned j = 0; j < N.y; j++) {
48 for (unsigned i = 0; i < N.x; i++) {
49
50 auto b1 = s*glm::vec3(i + 0.5f,
51 j + 0.5f,
52 k + 0.5f);
53 auto b0 = glm::vec3(1.f) - b1;
54
55 auto p = b0*min + b1*max;
56
57 float value = 0.f;
58 for (const auto & q : Q) {
59 const auto v_ = q - p;
60 if (glm::dot(v_, v_) <= r2) value += 10.f*(r2 - glm::dot(v_, v_));
61 }
62
63 v[(k*N.y + j)*N.x + i] = value;
64 }
65 }
66 }
67
68
69 for (unsigned k = 0; k < N.z; k++) {
70 for (unsigned j = 0; j < N.y; j++) {
71 for (unsigned i = 0; i < N.x; i++) {
72
73 unsigned km = std::max(k, 1u) - 1;
74 unsigned kp = std::min(k + 1, N.z - 1);
75 unsigned jm = std::max(j, 1u) - 1;
76 unsigned jp = std::min(j + 1, N.y - 1);
77 unsigned im = std::max(i, 1u) - 1;
78 unsigned ip = std::min(i + 1, N.x - 1);
79
80 data[(k*N.y + j)*N.x + i] = glm::vec4((1.0 / (ip - im))*(v[(k*N.y + j)*N.x + ip] - v[(k*N.y + j)*N.x + im]),
81 (1.0 / (jp - jm))*(v[(k*N.y + jp)*N.x + i] - v[(k*N.y + jm)*N.x + i]),
82 (1.0 / (kp - km))*(v[(kp*N.y + j)*N.x + i] - v[(km*N.y + j)*N.x + i]),
83 v[(k*N.y + j)*N.x + i]);
84
85 }
86 }
87 }
88
89 }
90
91 };
92
93 struct OctDummyTask
94 {
95 Context* context;
96 std::shared_ptr<Volumetric::OctDummyPersistent> persistent;
97
98 void operator()()
99 {
100 auto group = context->taskManager->createGroup(Cogs::Core::TaskManager::ResourceQueue);
101
102 for (size_t i = 0; i < persistent->responses.size(); i++) {
103 context->taskManager->enqueueChild(group, OctDummySubTask{ persistent, i });
104 }
105 context->taskManager->wait(group);
106 persistent->tasksRunning = false;
107 }
108
109 };
110
111
112
113}
114
115
116
118{
120
121 octtreeSystem = ExtensionRegistry::getExtensionSystem<OctSystem>(context);
122 assert(octtreeSystem && "octtreeSystem must be initialized before octtreeRenderSystem");
123}
124
126{
127 const unsigned L = 300;
128
129 // Update set of tiles before OctSystem:Update(@PostView) runs.
130 for (auto & providerComp : pool) {
131 const auto * markerPointSetComponent = providerComp.debugSource->getComponent<MarkerPointSetComponent>();
132
133 if (providerComp.hasChanged() || markerPointSetComponent->hasChanged()) {
134 auto & providerData = getData(&providerComp);
135 auto * octComp = providerComp.getComponent<OctComponent>();
136
137 // If anything has changed, flush everything and re-populate octComp.
138 if (providerComp.hasChanged()) {
139 octComp->clearAllRegions = true;
140 providerData.pointsSeen = std::max(size_t(L), markerPointSetComponent->positions.size()) - L;
141 }
142
143 // Fill and pop points.
144 const glm::vec3 R(providerComp.radius);
145 while (providerData.pointsSeen < markerPointSetComponent->positions.size()) {
146 const auto & p = markerPointSetComponent->positions[providerData.pointsSeen];
147 octComp->regionsToAdd.push_back(Region{ providerData.pointsSeen, p - R, p + R });
148 providerData.pointsSeen++;
149 if (L <= providerData.pointsSeen) {
150 octComp->regionsToRemove.push_back(providerData.pointsSeen - L);
151 }
152 }
153
154 octComp->setChanged();
155 }
156 }
157}
158
159
161{
162 for (auto & providerComp : pool) {
163 const auto * markerPointSetComponent = providerComp.debugSource->getComponent<MarkerPointSetComponent>();
164
165 if(!markerPointSetComponent) continue;
166
167 auto & providerData = getData(&providerComp);
168
169 if (!providerData.persistent) providerData.persistent = std::make_shared<OctDummyPersistent>();
170 if(providerData.persistent->tasksRunning) continue;
171
172
173 auto * octComp = providerComp.getComponent<OctComponent>();
174 while (!providerData.persistent->responses.empty()) {
175 octComp->submitTileResponse(std::move(providerData.persistent->responses.back()), true);
176 providerData.persistent->responses.pop_back();
177 }
178
179 // OctSystem:Update(@PostView) has run, pull new requests and populate with data.
180 for (const auto reqTileKey : octComp->tileRequests) {
181
182 auto res = octComp->initTileResponse(&reqTileKey);
183 if (!res) break;
184
185 if (res->regionKeys.empty()) {
186 LOG_WARNING(logger, "Tile request with no regions.");
187 }
188
189 providerData.persistent->responses.push_back(std::move(res));
190 }
191
192 providerData.persistent->radius = providerComp.radius;
193 providerData.persistent->positions = markerPointSetComponent->positions; // Make a copy that is fixed while task is running.
194 providerData.persistent->tasksRunning = true;
195 context->taskManager->enqueue(Cogs::Core::TaskManager::ResourceQueue, OctDummyTask{ context, providerData.persistent });
196
197 }
198}
Context * context
Pointer to the Context instance the system lives in.
virtual void initialize(Context *context)
Initialize the system.
void update()
Updates the system state to that of the current frame.
void preUpdate()
Run the pre-update method of the system.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
std::unique_ptr< class TaskManager > taskManager
TaskManager service instance.
Definition: Context.h:186
! Generate a set of points for the given position array.
static constexpr TaskQueueId ResourceQueue
Resource task queue.
Definition: TaskManager.h:232
Log implementation class.
Definition: LogManager.h:139
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
bool clearAllRegions
If set to true, all current regions are discarded before regionsToAdd is processed.
Definition: OctComponent.h:95
void initialize(Context *context) override
Initialize the system.