Cogs.Core
AdaptivePlanarGridSystem.h
1#pragma once
2
3#include <list>
4#include <glm/glm.hpp>
5
6#include "Systems/ComponentSystem.h"
7
8#include "Components/Geometry/AdaptivePlanarGridComponent.h"
9
10#include "Resources/Resources.h"
11
12namespace Cogs
13{
14 namespace Core
15 {
16 class Context;
17
19 {
20 uint32_t xIndex;
21 uint32_t yIndex;
22 uint8_t level;
23 };
24
26 {
27 int children[4];
28 static const int DeadEnd = -1;
29 static const int Leaf = -2;
30 };
31
32 const int NoParent = -1;
33
35 {
37 int parent;
38 int isWhichChild;
39 };
40
42 {
44 uint8_t adjacentLevels[4];
45 glm::vec4 texCoordWorldTransform;
46 glm::vec4 texCoordUnitTransform;
47 MaterialInstanceHandle materialInstance;
48 };
49
50
52 {
53 typedef void InitMaterialInstanceCallback(MaterialInstance* instance, ComponentModel::Entity* container, void* data);
54
55 MaterialHandle material;
56 ConstantBufferKey bufferKey;
57 VariableKey lodLevelsKey = {};
58 VariableKey texCoordWorldTransformKey = {};
59 VariableKey texCoordUnitTransformKey = {};
60 VariableKey texCoordLinearTransformKey = {};
61
62 InitMaterialInstanceCallback * initMaterialInstanceCallback = nullptr;
63 void * initMaterialInstanceData = nullptr;
64
65 };
66
68 {
70
71 glm::mat2 texCoordLinearTransform = glm::mat2(1.f, 0.f, 0.f, 1.f);
72 glm::vec2 texCoordPeriod = glm::vec2(std::numeric_limits<float>::quiet_NaN());
73
74 glm::dvec2 currentExtentMin = glm::dvec2(0.0);
75 glm::dvec2 currentExtentMax = glm::dvec2(0.0);
76
77 glm::dvec3 currentOrigin = glm::dvec3(-1);
78
79 unsigned objectId = 0;
80
81 int camYaw = 0;
82
83 int tileResolutionLog2 = -1;
84 int tessellations = 8;
85
86 MeshHandle gridMesh;
87
88 bool initialized = false;
89 bool materialInstancesChanged = false;
90
91 MeshHandle proxyMesh;
92 MeshHandle debugMesh;
93 EntityPtr debugGraphics;
94 EntityPtr tileEntitiesGroup;
95
96 std::vector<AdaptivePlanarGridTile> tiles;
97
98 std::vector<MaterialInstanceHandle> materialPool;
99 std::vector<EntityPtr> entityPool;
100 };
101
102 class AdaptivePlanarGridSystem : public ComponentSystemWithDataPool<AdaptivePlanarGridComponent, AdaptivePlanarGridData>
103 {
104 public:
106
107 void update(Context * context) override;
108
109 void COGSCORE_DLL_API registerMaterial(const AdaptivePlanarGridComponent * gridComp, MaterialHandle material, AdaptivePlanarGridMaterialData::InitMaterialInstanceCallback * initMaterialInstanceCallback, void* initMaterialInstanceData);
110
111 void setTexCoordTransform(const AdaptivePlanarGridComponent * gridComp, const glm::mat2 transform, const glm::vec2 period);
112
113 };
114 } // of namespace Core
115} // of namespace Cogs
Container for components, providing composition of dynamic entities.
Definition: Entity.h:18
Context * context
Pointer to the Context instance the system lives in.
void update()
Updates the system state to that of the current frame.
Component system with parallel data per component stored in a pool similar to how the components them...
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
Base allocator implementation.
Definition: Allocator.h:30
std::shared_ptr< ComponentModel::Entity > EntityPtr
Smart pointer for Entity access.
Definition: EntityPtr.h:12
uint16_t VariableKey
Used to lookup material properties.
Definition: Resources.h:46
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
ComponentIndex SizeType
Type used to track the size of pools.
Definition: Component.h:19
Material instances represent a specialized Material combined with state for all its buffers and prope...