Cogs.Core
OctRenderer.cpp
1#include "Renderer/Tasks/RenderListTask.h"
2#include "Renderer/Renderer.h"
3#include "Renderer/RenderStateUpdater.h"
4#include "Renderer/Tasks/FilterListTask.h"
5#include "Resources/VertexFormats.h"
6#include "Resources/MaterialManager.h"
7#include "Components/Core/RenderComponent.h"
8#include "Components/Core/SceneComponent.h"
9#include "Systems/Core/CameraSystem.h"
10#include "Systems/Core/TransformSystem.h"
11#include "Renderer/Tasks/RenderListTask.h"
12#include "ExtensionRegistry.h"
13
14#include "OctRenderer.h"
15#include "../Systems/OctSystem.h"
16
17#include "Rendering/RasterizerState.h"
18#include "Rendering/IGraphicsDevice.h"
19#include "Rendering/IBuffers.h"
20#include "Rendering/IRenderTargets.h"
21
22#include "Foundation/Memory/MemoryBuffer.h"
23
24#include <unordered_map>
25
26namespace {
27 using namespace Cogs;
28 using namespace Cogs::Core;
29
30 struct InstanceData
31 {
32 glm::vec4 min; // .w is age shift
33 glm::vec4 max; // .w is currently unused.
34 glm::vec4 texpos;
35 //glm::u16vec4 key;
36 glm::uvec4 key;
37 };
38
39 struct OctParams
40 {
41 glm::vec3 eye_local;
42 float valueMin;
43 glm::vec3 lightdir_local;
44 float valueScale; // 1.0/(max-min)
45 float turbidity;
46 float ageScale;
47 };
48
49 struct DebugConstants
50 {
51 glm::mat4 projectionMatrix;
52 glm::mat4 viewMatrix;
53 glm::mat4 worldMatrix;
54 glm::vec4 diffuseColor;
55 };
56
57 static const uint32_t indices[] = {
58 0, 1, 2,
59 1, 3, 2,
60
61 4, 6, 5,
62 5, 6, 7,
63
64 0, 4, 1,
65 1, 4, 5,
66
67 0, 2, 6,
68 6, 4, 0,
69
70 1, 7, 3,
71 1, 5, 7,
72
73 3, 6, 2,
74 3, 7, 6
75 };
76
77 static const uint32_t edgeIndices[] = {
78 0, 1, 0, 2, 0, 4,
79 1, 3, 1, 5,
80 2, 3, 2, 6,
81 3, 7,
82 4, 5, 4, 6,
83 5, 7,
84 6, 7
85 };
86
87 static const glm::vec3 positions[] = {
88 glm::vec3(0, 0, 0),
89 glm::vec3(1, 0, 0),
90 glm::vec3(0, 1, 0),
91 glm::vec3(1, 1, 0),
92
93 glm::vec3(0, 0, 1),
94 glm::vec3(1, 0, 1),
95 glm::vec3(0, 1, 1),
96 glm::vec3(1, 1, 1),
97 };
98
99 static const glm::vec4 boxColor[4] = {
100 glm::vec4(0.4f, 1.0f, 0.2f, 1.0f),
101 glm::vec4(0.4f, 1.0f, 1.0f, 1.0f),
102 glm::vec4(0.4f, 0.4f, 1.0f, 1.0f),
103 glm::vec4(1.0f, 0.4f, 1.0f, 1.0f),
104 };
105
106 static void octtreeDebugRenderCallback(RenderTaskContext * taskContext, DrawContext * drawContext, const RenderItem * item)
107 {
108 RenderInstrumentationScope(taskContext->device->getImmediateContext(), SCOPE_VOLUMETRIC, "Octtree::debugRenderCallback");
109 auto * device = drawContext->device;
110 auto * context = drawContext->deviceContext;
111 const auto * octtreeData = (Volumetric::OctData*)item->callbackData;
112 const auto * transComp = octtreeData->comp->getComponent<TransformComponent>();
113 auto & worldFromLocal = drawContext->context->transformSystem->getLocalToWorld(transComp);
114
115 //context->setRasterizerState(drawContext->renderer->renderStates.getRasterizerState(Cogs::RasterizerState::DefaultState()));
116 context->setRasterizerState(taskContext->states->rasterizerStateHandles[drawContext->renderer->getRenderStates().getRasterizerState(Cogs::RasterizerState::DefaultState())]);
117 context->setDepthStencilState(drawContext->renderer->getRenderStates().noWriteDepthStencilStateHandle);
118 context->setBlendState(drawContext->renderer->getRenderStates().blendStates[size_t(BlendMode::None)].handle);
119
120 auto cubeIndices = device->getBuffers()->loadIndexBuffer(edgeIndices, sizeof(edgeIndices) / sizeof(uint32_t), sizeof(uint32_t));
121 drawContext->deviceContext->setIndexBuffer(cubeIndices);
122
123 Cogs::VertexBufferHandle cubeVertices = device->getBuffers()->loadVertexBuffer(positions,
124 sizeof(positions) / sizeof(glm::vec3),
125 Cogs::Core::VertexFormats::Pos3f); // format is Vec3f
126 uint32_t strides[] = { sizeof(glm::vec3) };
127 drawContext->deviceContext->setVertexBuffers(&cubeVertices, 1, strides, nullptr);
128
129 auto octSys = octtreeData->comp->system;
130
131 context->setInputLayout(octSys->inputLayoutHandle);
132 context->setEffect(octSys->effectHandle);
133
134 Cogs::BufferHandle constantBuffer = device->getBuffers()->loadBuffer(nullptr, sizeof(DebugConstants), Usage::Dynamic, AccessMode::Write, BindFlags::ConstantBuffer);
135
136 auto renderNode = [&](const Volumetric::NodeBlock& node)
137 {
138 glm::mat4 world =
139 worldFromLocal *
140 Volumetric::OctSystem::LocalFromIndexSpaceTransform(*octtreeData->comp, *octtreeData)*
141 glm::translate(glm::mat4(), glm::vec3(node.extentMin)) *
142 glm::scale(glm::mat4(), glm::vec3(node.extentMax - node.extentMin));
143
144 //world = glm::translate(world, glm::vec3(octtreeData->shift.x + node.extentMin.x,
145 // octtreeData->shift.y + node.extentMin.y,
146 // octtreeData->shift.z + node.extentMin.z));
147 //world = glm::scale(world, glm::vec3(node.extentMax - node.extentMin));
148
149 //world = glm::scale(world, glm::vec3(static_cast<float>(1 << node.ix4.w)));
150 //world = glm::translate(world, glm::vec3(node.ix4.x,
151 // node.ix4.y,
152 // node.ix4.z));
153
154 {
155 MappedBuffer<DebugConstants> constants(context, constantBuffer, MapMode::WriteDiscard);
156 if (constants) {
157 constants->projectionMatrix = drawContext->cameraData->projectionMatrix;
158 constants->viewMatrix = drawContext->cameraData->viewMatrix;
159 constants->worldMatrix = world;
160 constants->diffuseColor = boxColor[node.ix4.w & 3];
161 }
162 }
163 context->setConstantBuffer("DebugBuffer", constantBuffer);
164
165 context->drawIndexed(Cogs::PrimitiveType::LineList, 0, 0);
166 };
167
168#if 1
169 for (const auto nodeIx : octtreeData->front) {
170 renderNode(octtreeData->nodes[nodeIx]);
171 }
172#elif 1
173 for (const auto & node : octtreeData->nodes) {
174 //if (node.ix4.w < 1) continue;
175 //if(2 <= node.ix4.w) continue;
176 renderNode(node);
177 }
178#else
179 for (const auto & it : octtreeData->baseBlocks) {
180 const auto & baseBlock = it.second;
181
182 glm::mat4 world = glm::translate(glm::vec3(baseBlock.i - 0x7fff,
183 baseBlock.j - 0x7fff,
184 baseBlock.k - 0x7fff));
185 {
186 MappedBuffer<DebugConstants> constants(context, constantBuffer, MapMode::WriteDiscard);
187 if (constants) {
188 constants->projectionMatrix = drawContext->cameraData->projectionMatrix;
189 constants->viewMatrix = drawContext->cameraData->viewMatrix;
190 constants->worldMatrix = world;
191 constants->diffuseColor = boxColor[node.ix4.w & 3];
192 }
193 }
194 context->setConstantBuffer("DebugBuffer", constantBuffer);
195
196 context->drawIndexed(Cogs::PrimitiveType::LineList, 0, 0);
197 }
198#endif
199
200 device->getBuffers()->releaseBuffer(constantBuffer);
201 device->getBuffers()->releaseIndexBuffer(cubeIndices);
202 device->getBuffers()->releaseVertexBuffer(cubeVertices);
203 }
204
205 static void renderCallback(RenderTaskContext * taskContext, DrawContext * drawContext, RenderListTask* task, const RenderItem * item)
206 {
207 const auto * octData = (Volumetric::OctData*)item->callbackData;
208 const auto * octComp = octData->comp;
209 const auto * camData = drawContext->cameraData;
210 auto * renderer = taskContext->renderer;
211 auto * device = renderer->getDevice();
212 auto * effects = device->getEffects();
213 auto * iContext = device->getImmediateContext();
214 auto * octtreeRenderer = octComp->system->renderer;
215
216 iContext->setViewport(camData->viewportOrigin.x,
217 camData->viewportOrigin.y,
218 camData->viewportSize.x != 0 ? camData->viewportSize.x : renderer->getSize().x,
219 camData->viewportSize.y != 0 ? camData->viewportSize.y : renderer->getSize().y);
220
221 //iContext->setDepthStencilState(item->depthState);
222 iContext->setDepthStencilState(taskContext->states->commonDepthStates[item->depthState]);
223 //iContext->setBlendState(item->transparencyState.blendState);
224 iContext->setBlendState(taskContext->states->blendStates[item->blendState].handle);
225 //iContext->setRasterizerState(getRasterizerState(renderer, item, camData->flipWindingOrder));
226
227 const RenderPassOptions passOptions = initRenderPassOptions(*item, *camData);
228 iContext->setRasterizerState(taskContext->states->rasterizerStateHandles[getRasterizerState(renderer, *item, passOptions, camData->flipWindingOrder)]);
229
230 applyMaterialPermutation(taskContext, drawContext, item->binding, item->renderMaterialInstance);
231 task->applyMaterial(*drawContext, *item);
232 //updateEnvironmentBindings(drawContext, item->binding);
233 applyMaterialInstance(drawContext, item->binding, item->renderMaterialInstance);
234
235 //auto renderMaterialInstance = renderer->resources.getRenderMaterialInstance(materialInstance);
236 assert(item->renderMaterialInstance);
237
238 Cogs::VertexBufferHandle vertexBuffers[2] = {
239 octtreeRenderer->cubeVertices,
240 octData->instanceBufferHandle
241 };
242
243 //FIXME: Set strides/offsets.
244 iContext->setVertexBuffers(vertexBuffers, 2);
245 iContext->setIndexBuffer(octtreeRenderer->cubeIndices);
246
247 EngineBuffers & engineBuffers = renderer->getEngineBuffers();
248 ObjectBuffer & objectParameters = engineBuffers.objectBuffer;
249
250
251 const auto & worldMatrix = taskContext->context->transformSystem->getLocalToWorld(octComp->getComponent<TransformComponent>());
252 auto worldFromIndex =
253 worldMatrix *
254 Volumetric::OctSystem::LocalFromIndexSpaceTransform(*octComp, *octData);
255
256 objectParameters.worldMatrix = worldFromIndex;
257
258 auto localToView = camData->viewMatrix * objectParameters.worldMatrix;
259
260 const auto bindings = item->binding;
261 if(!HandleIsValid(engineBuffers.objectBufferHandle)) return;
262 {
263 Cogs::MappedBuffer<ObjectBuffer> objectBuffer(iContext, engineBuffers.objectBufferHandle, Cogs::MapMode::WriteDiscard);
264 if (objectBuffer) std::memcpy(objectBuffer.get(), &objectParameters, sizeof(ObjectBuffer));
265 }
266 iContext->setConstantBuffer(bindings->objectBufferBinding, engineBuffers.objectBufferHandle);
267 auto octBinding = effects->getConstantBufferBinding(item->binding->renderEffect->effectHandle, "OctParams");
268 if (HandleIsValid(octBinding)) {
269 {
270 auto eye_local = glm::inverse(localToView)*glm::vec4(0, 0, 0, 1);
271 Cogs::MappedBuffer<OctParams> op(iContext, octtreeRenderer->octParamsBuffer, Cogs::MapMode::WriteDiscard);
272
273 if (op) {
274 op->eye_local = (1.f / eye_local.w)*glm::vec3(eye_local);
275 op->valueMin = octComp->valueMin;
276 op->lightdir_local = -glm::normalize(glm::vec3(1, 1, 1));
277 op->valueScale = 1.f / (octComp->valueMax - octComp->valueMin);
278 op->turbidity = std::max(1.f, octComp->turbidity);
279 op->ageScale = octComp->ageScale;
280 }
281 }
282 iContext->setConstantBuffer(octBinding, octtreeRenderer->octParamsBuffer);
283 }
284
285 unsigned unit = (unsigned)item->materialInstance->textureVariables.size();
286 iContext->setTexture("atlasTexture0", unit, octData->atlas.textureAtlas0);
287 iContext->setSamplerState("atlasSampler0", unit, octtreeRenderer->atlasSampler);
288 unit++;
289
290 if (HandleIsValid(octData->atlas.textureAtlas1)) {
291 iContext->setTexture("atlasTexture1", unit, octData->atlas.textureAtlas1);
292 iContext->setSamplerState("atlasSampler1", unit, octtreeRenderer->atlasSampler);
293 unit++;
294 }
295
296 RenderTexture * transferTex = drawContext->renderer->getRenderResources().getRenderTexture(octComp->transferTexture);
297 if (transferTex == nullptr) return;
298
299 iContext->setTexture("transferTexture", unit, transferTex->textureHandle);
300 iContext->setSamplerState("transferSampler", unit, octtreeRenderer->atlasSampler);
301 unit++;
302
303 iContext->drawInstancedIndexed(Cogs::PrimitiveType::TriangleList, 0, octData->instanceCount, 0, 36);
304 }
305}
306
308{
309 octSystem = ExtensionRegistry::getExtensionSystem<OctSystem>(context);
310 this->device = device;
311 this->context = context;
312 auto * buffers = device->getBuffers();
313 auto * textures = device->getTextures();
314
315 octParamsBuffer = buffers->loadBuffer(nullptr, sizeof(OctParams), Usage::Dynamic, AccessMode::Write, BindFlags::ConstantBuffer);
316
317 cubeIndices = device->getBuffers()->loadIndexBuffer(indices, sizeof(indices) / sizeof(uint32_t), sizeof(uint32_t));
318 cubeVertices = device->getBuffers()->loadVertexBuffer(positions, sizeof(positions) / sizeof(glm::vec3), Cogs::Core::VertexFormats::Pos3f);
319
325 atlasSampler = textures->loadSamplerState(sampler);
326
327
328 depthStencilState = device->getRenderTargets()->loadDepthStencilState(DepthStencilState{ true, false, DepthStencilState::Less });
329
330 Cogs::VertexElement elements[] = {
331 { sizeof(float) * 0, Cogs::DataFormat::X32Y32Z32W32_FLOAT, Cogs::ElementSemantic::InstanceVector, 0, Cogs::InputType::InstanceData, 1 },
332 { sizeof(float) * 4, Cogs::DataFormat::X32Y32Z32W32_FLOAT, Cogs::ElementSemantic::InstanceVector, 1, Cogs::InputType::InstanceData, 1 },
333 { sizeof(float) * 8, Cogs::DataFormat::X32Y32Z32W32_FLOAT, Cogs::ElementSemantic::InstanceVector, 2, Cogs::InputType::InstanceData, 1 },
334 { sizeof(float) * 12, Cogs::DataFormat::R32G32B32A32_UINT, Cogs::ElementSemantic::InstanceVector, 3, Cogs::InputType::InstanceData, 1 }
335 };
336
337 octStreamsLayout.vertexFormats[0] = VertexFormats::Pos3f;
338 octStreamsLayout.vertexFormats[1] = Cogs::VertexFormats::createVertexFormat(elements, glm::countof(elements));
339 octStreamsLayout.numStreams = 2;
340 octStreamsLayout.updateHash();
341
342 defaultMatInstance = context->materialInstanceManager->createMaterialInstance(context->materialManager->getDefaultMaterial());
343}
344
345void Cogs::Core::Volumetric::OctRenderer::handleEvent(uint32_t eventId, const DrawContext * renderingContext)
346{
347 auto * iContext = device->getImmediateContext();
348 auto * buffers = device->getBuffers();
349
350 switch (eventId) {
352 for (auto & octComp : octSystem->pool) {
353 auto & octData = octSystem->getData(&octComp);
354
355 if (octData.gpuCacheWipe) handleAtlasWipe(renderingContext, octComp, octData);
356
357 octData.atlas.handleStaging(renderingContext, octComp, octData, octData.currentTimestamp);
358
359 octData.instanceCount = static_cast<unsigned>(octData.front.size());
360 if (octData.instanceCount) {
361 {
362 static bool missingDataPrev = false;
363
364 bool missingData = false;
365
366 unsigned W = octComp.tileSize * octComp.gpuCacheSize;
367
368 float texW = (octComp.tileSize - 2.f) / W;
369 float texS = 1.f / W;
370
371 octData.instanceBufferHandle = buffers->loadVertexBuffer(nullptr, octData.instanceCount, octStreamsLayout.vertexFormats[1]);
372 Cogs::MappedBuffer<InstanceData> instanceData(iContext, octData.instanceBufferHandle, Cogs::MapMode::WriteDiscard, octData.front.size());
373
374 if (instanceData) {
375 for (size_t i = 0; i < octData.instanceCount; i++) {
376 const auto & node = octData.nodes[octData.front[i]];
377
378 auto slotPos = octData.atlas.slotPosition(octComp, createTileKey(node.ix4, octData.alignMinToZeroShift));
379
380 bool missing = (slotPos.x == 0) && (slotPos.y == 0) && (slotPos.z == 0);
381
382 if (missing) missingData = true;
383
384
385 const float scale = static_cast<float>(1 << node.ix4.w);
386 const glm::uvec3 lll = glm::uvec3(node.ix4.x << node.ix4.w,
387 node.ix4.y << node.ix4.w,
388 node.ix4.z << node.ix4.w);
389
390 float ageShift = 0.f;
391 if (octComp.alphaCallback.func) {
392 ageShift = octComp.alphaCallback.func(octComp.alphaCallback.data,
393 octData.atlas.slots[slotPos.w].clientData);
394 }
395
396 instanceData[i].min = glm::vec4((1.f / scale)*glm::vec3(glm::uvec3(node.extentMin) - lll), ageShift);
397 instanceData[i].max = glm::vec4((1.f / scale)*glm::vec3(glm::uvec3(node.extentMax) - lll), 0.f);
398
399 instanceData[i].texpos = glm::vec4((float)slotPos.x / octComp.gpuCacheSize + texS,
400 (float)slotPos.y / octComp.gpuCacheSize + texS,
401 (float)slotPos.z / octComp.gpuCacheSize + texS,
402 missing ? -1.f : texW);
403
404 assert(0 <= instanceData[i].min.x);
405 assert(0 <= instanceData[i].min.y);
406 assert(0 <= instanceData[i].min.z);
407 assert(instanceData[i].max.x <= 1.f);
408 assert(instanceData[i].max.y <= 1.f);
409 assert(instanceData[i].max.z <= 1.f);
410 instanceData[i].key = node.ix4;
411 }
412 }
413 if (missingDataPrev != missingData) {
414 //std::cerr << "Render tile is " << (missingData ? "" : "not ") << "missing\n";
415 missingDataPrev = missingData;
416 }
417 }
418 }
419 }
420 break;
421
423 for (const auto & octRenderComp : octSystem->pool) {
424 auto & octRenderData = octSystem->getData(&octRenderComp);
425 if (octRenderData.instanceCount) {
426 buffers->releaseVertexBuffer(octRenderData.instanceBufferHandle);
427 }
428 }
429 break;
430 default:
431 break;
432 }
433}
434
435void Cogs::Core::Volumetric::OctRenderer::handleAtlasWipe(const DrawContext * renderingContext, OctComponent& octComp, OctData& octData)
436{
437 octData.gpuCacheWipe = false;
438 octComp.tileRequests.clear();
439
440 while (!octData.tileResponses.empty()) {
441 octData.tileResponsesStash.push_back(std::move(octData.tileResponses.back()));
442 octData.tileResponses.pop_back();
443 }
444 octData.atlas.reset(renderingContext, octData, octComp.tileSize, octComp.gpuCacheSize, octData.currentTimestamp);
445}
446
447void Cogs::Core::Volumetric::OctRenderer::generateCommands(const RenderTaskContext * /*renderingContext*/, RenderList * renderList)
448{
449 for (auto & octComp : octSystem->pool) {
450 auto * sceneComp = octComp.getComponent<SceneComponent>();
451 if (sceneComp->visible == false) continue;
452
453 const auto * transformComponent = octComp.getComponent<TransformComponent>();
454 if (!transformComponent) continue;
455
456 auto & octData = octSystem->getData(&octComp);
457 if (octData.instanceCount == 0) continue;
458
459 if (!HandleIsValid(octData.atlas.textureAtlas0)) continue;
460
461 if (octComp.drawDebug) {
462 auto & item = renderList->createCustom(&debugStreamsLayout);
463 item.layer = RenderLayers::Default;
464 //item.bbox = Geometry::BoundingBox{ glm::vec3(-100.f), glm::vec3(100.f) }; // FIXME: world-space bounds
465
466 //item.material = defaultMatInstance->material;
467 item.materialInstance = defaultMatInstance.resolve();
468
469 item.blendState = (uint16_t)BlendMode::None; // TransparencyState{ renderer->renderStates.noBlendStateHandle, false }; // No transparency for now.
470 item.depthState = (uint16_t)DepthMode::NoWrite;// depthStencilState;
471
472 item.flags = RenderItemFlags::Custom;
473 item.setCallbackData(&octData);
474 item.callback = octtreeDebugRenderCallback;
475 }
476
477 auto & item = renderList->createCustom(&octStreamsLayout);
478 item.layer = RenderLayers::Default;
479 //item.bbox = Geometry::BoundingBox{ glm::vec3(-100.f), glm::vec3(100.f) }; // FIXME
480
481 item.materialInstance = octData.materialInstance.resolve();
482 //item.material = item.materialInstance->material;
483
484 //item.transparencyState = TransparencyState{ renderer->renderStates.noBlendStateHandle, true, 0 };
485 item.blendState = (uint16_t)BlendMode::None; // TransparencyState{ renderer->renderStates.noBlendStateHandle, false }; // No transparency for now.
486 item.depthState = (uint16_t)DepthMode::NoWrite;// depthStencilState;
487
488 item.flags = RenderItemFlags::Custom2 | RenderItemFlags::Transparent;
489 item.setCallbackData(&octData);
490 item.callback2 = renderCallback;
491 }
492}
ComponentType * getComponent() const
Definition: Component.h:159
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Definition: Context.h:83
RenderStates & getRenderStates() override
Get the reference to the RenderStates structure.
Definition: Renderer.h:68
IGraphicsDevice * getDevice() override
Get the graphics device used by the renderer.
Definition: Renderer.h:45
Contains information on how the entity behaves in the scene.
Defines a 4x4 transformation matrix for the entity and a global offset for root entities.
Represents a graphics device used to manage graphics resources and issue drawing commands.
virtual IEffects * getEffects()=0
Get a pointer to the effect management interface.
virtual ITextures * getTextures()=0
Get a pointer to the texture management interface.
virtual IContext * getImmediateContext()=0
Get a pointer to the immediate context used to issue commands to the graphics device.
virtual IBuffers * getBuffers()=0
Get a pointer to the buffer management interface.
virtual IRenderTargets * getRenderTargets()=0
Get a pointer to the render target management interface.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
@ None
No blending enabled for opaque shapes, defaults to Blend for transparent shapes.
@ NoWrite
Depth test enabled, write disabled.
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
@ InstanceData
Per instance data.
@ InstanceVector
Instance vector semantic.
@ Write
The buffer can be mapped and written to by the CPU after creation.
Definition: Flags.h:50
@ ConstantBuffer
The buffer can be bound as input to effects as a constant buffer.
Definition: Flags.h:72
std::vector< TextureValue > textureVariables
Texture property values for this instance.
VertexFormatHandle vertexFormats[maxStreams]
COGSCORE_DLL_API void updateHash()
RenderLayers layer
Visibility mask.
Definition: RenderList.h:170
@ PostRender
Rendering has finished for a given rendering context.
Definition: IRenderer.h:101
@ PreRender
Pre rendering happening for a given rendering context.
Definition: IRenderer.h:93
ResourceType * resolve() const
Resolve the handle, returning a pointer to the actual resource.
Representing a block or node in the oct-tree.
Definition: OctSystem.h:49
std::vector< TileRequest > tileRequests
Requests for tiles, populated by OctSystem::update, consumed by provider.
Definition: OctComponent.h:106
void handleEvent(uint32_t eventId, const DrawContext *renderingContext) override
Called when rendering events occur.
void initialize(Context *context, IGraphicsDevice *device) override
Initialize the extension using the given context and device.
Encapsulates state for depth buffer usage and stencil buffer usage in a state object.
virtual IndexBufferHandle loadIndexBuffer(const void *indexData, const size_t count, const size_t indexSize)=0
Loads a new index buffer and populates it with the given indexData.
virtual VertexBufferHandle loadVertexBuffer(const void *vertexData, const size_t count, const VertexFormat &vertexFormat)=0
Loads a new vertex buffer and populates it with the given data.
virtual void setIndexBuffer(IndexBufferHandle bufferHandle, uint32_t stride=4, uint32_t offset=0)=0
Sets the current index buffer.
virtual void setVertexBuffers(const VertexBufferHandle *vertexBufferHandles, const size_t count, const uint32_t *strides, const uint32_t *offsets)=0
Sets the current vertex buffers.
virtual DepthStencilStateHandle loadDepthStencilState(const DepthStencilState &depthStencilState)=0
Load a depth stencil state object.
@ WriteDiscard
Write access. When unmapping the graphics system will discard the old contents of the resource.
Definition: Flags.h:103
Provides RAII style mapping of a buffer resource.
Definition: IBuffers.h:160
@ LineList
List of lines.
Definition: Common.h:120
@ TriangleList
List of triangles.
Definition: Common.h:116
static RasterizerState DefaultState()
Constructs a rasterizer state initialized with the default values.
Encapsulates state for texture sampling in a state object.
Definition: SamplerState.h:12
static SamplerState & DefaultState()
Constructs a sampler state initialized with the default values.
Definition: SamplerState.h:85
AddressMode addressModeW
Specifies the addressing mode along the W axis in texture coordinate space.
Definition: SamplerState.h:67
AddressMode addressModeS
Specifies the addressing mode along the S axis in texture coordinate space.
Definition: SamplerState.h:63
@ Clamp
Texture coordinates are clamped to the [0, 1] range.
Definition: SamplerState.h:17
@ MinMagMipLinear
Linear sampling for both minification and magnification.
Definition: SamplerState.h:35
FilterMode filter
Specifies the filter to use for texture sampling.
Definition: SamplerState.h:70
AddressMode addressModeT
Specifies the addressing mode along the T axis in texture coordinate space.
Definition: SamplerState.h:65
@ Dynamic
Buffer will be loaded and modified with some frequency.
Definition: Flags.h:30
Vertex element structure used to describe a single data element in a vertex for the input assembler.
Definition: VertexFormat.h:38