2#include "ExtensionRegistry.h"
3#include "Services/TaskManager.h"
4#include "Components/Geometry/MarkerPointSetComponent.h"
7#include "OctDummyProviderSystem.h"
9#include "Foundation/Logging/Logger.h"
17 struct OctDummySubTask
19 std::shared_ptr<Volumetric::OctDummyPersistent> persistent;
24 auto & res = persistent->responses[index];
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);
32 glm::vec3 s(1.f / N.x,
37 v.resize(N.x*N.y*N.z);
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]);
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++) {
50 auto b1 = s*glm::vec3(i + 0.5f,
53 auto b0 = glm::vec3(1.f) - b1;
55 auto p = b0*min + b1*max;
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_));
63 v[(k*N.y + j)*N.x + i] = value;
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++) {
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);
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]);
96 std::shared_ptr<Volumetric::OctDummyPersistent> persistent;
102 for (
size_t i = 0; i < persistent->responses.size(); i++) {
103 context->
taskManager->enqueueChild(group, OctDummySubTask{ persistent, i });
106 persistent->tasksRunning =
false;
121 octtreeSystem = ExtensionRegistry::getExtensionSystem<OctSystem>(
context);
122 assert(octtreeSystem &&
"octtreeSystem must be initialized before octtreeRenderSystem");
127 const unsigned L = 300;
130 for (
auto & providerComp : pool) {
133 if (providerComp.hasChanged() || markerPointSetComponent->hasChanged()) {
134 auto & providerData = getData(&providerComp);
135 auto * octComp = providerComp.getComponent<
OctComponent>();
138 if (providerComp.hasChanged()) {
140 providerData.pointsSeen = std::max(
size_t(L), markerPointSetComponent->positions.size()) - L;
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);
154 octComp->setChanged();
162 for (
auto & providerComp : pool) {
165 if(!markerPointSetComponent)
continue;
167 auto & providerData = getData(&providerComp);
169 if (!providerData.persistent) providerData.persistent = std::make_shared<OctDummyPersistent>();
170 if(providerData.persistent->tasksRunning)
continue;
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();
180 for (
const auto reqTileKey : octComp->tileRequests) {
182 auto res = octComp->initTileResponse(&reqTileKey);
185 if (res->regionKeys.empty()) {
186 LOG_WARNING(logger,
"Tile request with no regions.");
189 providerData.persistent->responses.push_back(std::move(res));
192 providerData.persistent->radius = providerComp.radius;
193 providerData.persistent->positions = markerPointSetComponent->positions;
194 providerData.persistent->tasksRunning =
true;
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.
std::unique_ptr< class TaskManager > taskManager
TaskManager service instance.
! Generate a set of points for the given position array.
static constexpr TaskQueueId ResourceQueue
Resource task queue.
Log implementation class.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
constexpr Log getLogger(const char(&name)[LEN]) noexcept
bool clearAllRegions
If set to true, all current regions are discarded before regionsToAdd is processed.
void initialize(Context *context) override
Initialize the system.