83QSSGRenderablesId QSSGRenderHelpers::createRenderables(
const QSSGFrameData &frameData,
84 QSSGPrepContextId prepId,
85 const QSSGNodeIdList &nodes,
88 QSSGRenderablesId rid { QSSGRenderablesId::Invalid };
89 if (nodes.size() > 0) {
90 auto *ctx = frameData.contextInterface();
91 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
92 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return rid);
93 return layer->createRenderables(prepId, nodes, flags);
114QSSGPrepContextId QSSGRenderHelpers::prepareForRender(
const QSSGFrameData &frameData,
115 const QSSGRenderExtension &ext,
116 QSSGCameraId cameraId,
119 auto *cn = QSSGRenderGraphObjectUtils::getCamera<QSSGRenderCamera>(cameraId);
120 QSSG_ASSERT_X(cn && QSSGRenderGraphObject::isCamera(cn->type),
"CameraId is not a camera!",
return QSSGPrepContextId::Invalid);
121 auto *ctx = frameData.contextInterface();
122 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
123 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return QSSGPrepContextId::Invalid);
124 return layer->getOrCreateExtensionContext(ext, cn, slot);
137QSSGPrepResultId QSSGRenderHelpers::commit(
const QSSGFrameData &frameData,
138 QSSGPrepContextId prepId,
139 QSSGRenderablesId renderablesId,
142 auto *ctx = frameData.contextInterface();
143 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
144 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return QSSGPrepResultId::Invalid);
145 return layer->prepareModelsForRender(*ctx, prepId, renderablesId, lodThreshold);
157void QSSGRenderHelpers::prepareRenderables(
const QSSGFrameData &frameData,
158 QSSGPrepResultId prepId,
159 QRhiRenderPassDescriptor *renderPassDescriptor,
160 QSSGRhiGraphicsPipelineState &ps,
161 QSSGRenderablesFilters filter)
163 auto *ctx = frameData.contextInterface();
164 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
165 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
166 layer->prepareRenderables(*ctx, prepId, renderPassDescriptor, ps, filter);
176void QSSGRenderHelpers::renderRenderables(
const QSSGFrameData &frameData,
177 QSSGPrepResultId prepId)
179 QSSGRenderContextInterface *ctx = frameData.contextInterface();
180 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
181 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
182 layer->renderRenderables(*ctx, prepId);
212void QSSGModelHelpers::setModelMaterials(
const QSSGFrameData &frameData,
213 QSSGRenderablesId renderablesId,
215 MaterialList materials)
217 auto *ctx = frameData.contextInterface();
218 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
219 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
220 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
221 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
222 layer->setModelMaterials(renderablesId, *renderModel, materials);
232void QSSGModelHelpers::setModelMaterials(
const QSSGFrameData &frameData,
233 QSSGRenderablesId renderablesId,
234 MaterialList materials)
236 auto *ctx = frameData.contextInterface();
237 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
238 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
239 layer->setModelMaterials(renderablesId, materials);
250QMatrix4x4 QSSGModelHelpers::getGlobalTransform(
const QSSGFrameData &frameData,
252 QSSGPrepContextId prepId)
254 auto *ctx = frameData.contextInterface();
255 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
256 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
257 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
258 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
259 return (prepId != QSSGPrepContextId::Invalid) ? layer->getGlobalTransform(prepId, *renderModel)
260 : layer->getGlobalTransform(*renderModel);
268QMatrix4x4 QSSGModelHelpers::getLocalTransform(
const QSSGFrameData &frameData, QSSGNodeId model)
271 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
272 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
273 return renderModel->localTransform;
281float QSSGModelHelpers::getGlobalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model)
283 auto *ctx = frameData.contextInterface();
284 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
285 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
286 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
287 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
288 return layer->getGlobalOpacity(*renderModel);
299float QSSGModelHelpers::getGlobalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model, QSSGPrepContextId prepId = QSSGPrepContextId::Invalid)
301 auto *ctx = frameData.contextInterface();
302 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
303 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
304 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
305 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
306 return (prepId != QSSGPrepContextId::Invalid) ? layer->getGlobalOpacity(prepId, *renderModel) : layer->getGlobalOpacity(*renderModel);
314float QSSGModelHelpers::getLocalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model)
317 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
318 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
319 return renderModel->localOpacity;
329void QSSGModelHelpers::setGlobalTransform(
const QSSGFrameData &frameData,
330 QSSGRenderablesId renderablesId,
332 const QMatrix4x4 &transform)
334 auto *ctx = frameData.contextInterface();
335 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
336 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
337 auto *node = QSSGRenderGraphObjectUtils::getNode(model);
338 QSSG_ASSERT_X(node && node->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
339 const auto &renderModel =
static_cast<
const QSSGRenderModel &>(*node);
340 layer->setGlobalTransform(renderablesId, renderModel, transform);
350void QSSGModelHelpers::setGlobalOpacity(
const QSSGFrameData &frameData, QSSGRenderablesId renderablesId, QSSGNodeId model,
float opacity)
352 auto *ctx = frameData.contextInterface();
353 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
354 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
355 auto *node = QSSGRenderGraphObjectUtils::getNode(model);
356 QSSG_ASSERT_X(node && node->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
357 const auto &renderModel =
static_cast<
const QSSGRenderModel &>(*node);
358 layer->setGlobalOpacity(renderablesId, renderModel, opacity);
379QMatrix4x4 QSSGCameraHelpers::getViewProjectionMatrix(
const QSSGCameraId cameraId,
380 const QMatrix4x4 *globalTransform)
382 auto *renderCamera = QSSGRenderGraphObjectUtils::getCamera<QSSGRenderCamera>(cameraId);
383 QSSG_ASSERT(renderCamera && QSSGRenderGraphObject::isCamera(renderCamera->type),
return {});
385 QMatrix4x4 mat44{Qt::Uninitialized};
386 const auto &projection = renderCamera->projection;
387 const auto &transform = (globalTransform != 0) ? *globalTransform : renderCamera->localTransform;
388 QSSGRenderCamera::calculateViewProjectionMatrix(transform, projection, mat44);
414void QSSGRenderExtensionHelpers::registerRenderResult(
const QSSGFrameData &frameData,
415 QSSGExtensionId extension,
416 QRhiTexture *texture)
418 if (
auto *ext = QSSGRenderGraphObjectUtils::getExtension<QSSGRenderExtension>(extension)) {
419 const QSSGRenderContextInterface *ctx = frameData.contextInterface();
420 ctx->bufferManager()->registerExtensionResult(*ext, texture);