85QSSGRenderablesId QSSGRenderHelpers::createRenderables(
const QSSGFrameData &frameData,
86 QSSGPrepContextId prepId,
87 const QSSGNodeIdList &nodes,
90 QSSGRenderablesId rid { QSSGRenderablesId::Invalid };
91 if (nodes.size() > 0) {
92 auto *ctx = frameData.contextInterface();
93 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
94 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return rid);
95 return layer->createRenderables(prepId, nodes, flags);
116QSSGPrepContextId QSSGRenderHelpers::prepareForRender(
const QSSGFrameData &frameData,
117 const QSSGRenderExtension &ext,
118 QSSGCameraId cameraId,
121 auto *cn = QSSGRenderGraphObjectUtils::getCamera<QSSGRenderCamera>(cameraId);
122 QSSG_ASSERT_X(cn && QSSGRenderGraphObject::isCamera(cn->type),
"CameraId is not a camera!",
return QSSGPrepContextId::Invalid);
123 auto *ctx = frameData.contextInterface();
124 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
125 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return QSSGPrepContextId::Invalid);
126 return layer->getOrCreateExtensionContext(ext, cn, slot);
139QSSGPrepResultId QSSGRenderHelpers::commit(
const QSSGFrameData &frameData,
140 QSSGPrepContextId prepId,
141 QSSGRenderablesId renderablesId,
144 auto *ctx = frameData.contextInterface();
145 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
146 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return QSSGPrepResultId::Invalid);
147 return layer->prepareModelsForRender(*ctx, prepId, renderablesId, lodThreshold);
159void QSSGRenderHelpers::prepareRenderables(
const QSSGFrameData &frameData,
160 QSSGPrepResultId prepId,
161 QRhiRenderPassDescriptor *renderPassDescriptor,
162 QSSGRhiGraphicsPipelineState &ps,
163 QSSGRenderablesFilters filter)
165 auto *ctx = frameData.contextInterface();
166 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
167 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
168 layer->prepareRenderables(*ctx, prepId, renderPassDescriptor, ps, filter);
178void QSSGRenderHelpers::renderRenderables(
const QSSGFrameData &frameData,
179 QSSGPrepResultId prepId)
181 QSSGRenderContextInterface *ctx = frameData.contextInterface();
182 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
183 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
184 layer->renderRenderables(*ctx, prepId);
214void QSSGModelHelpers::setModelMaterials(
const QSSGFrameData &frameData,
215 QSSGRenderablesId renderablesId,
217 MaterialList materials)
219 auto *ctx = frameData.contextInterface();
220 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
221 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
222 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
223 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
224 layer->setModelMaterials(renderablesId, *renderModel, materials);
234void QSSGModelHelpers::setModelMaterials(
const QSSGFrameData &frameData,
235 QSSGRenderablesId renderablesId,
236 MaterialList materials)
238 auto *ctx = frameData.contextInterface();
239 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
240 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
241 layer->setModelMaterials(renderablesId, materials);
252QMatrix4x4 QSSGModelHelpers::getGlobalTransform(
const QSSGFrameData &frameData,
254 QSSGPrepContextId prepId)
256 auto *ctx = frameData.contextInterface();
257 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
258 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
259 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
260 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
261 return (prepId != QSSGPrepContextId::Invalid) ? layer->getGlobalTransform(prepId, *renderModel)
262 : layer->getGlobalTransform(*renderModel);
270QMatrix4x4 QSSGModelHelpers::getLocalTransform(
const QSSGFrameData &frameData, QSSGNodeId model)
273 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
274 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
275 return renderModel->localTransform;
283float QSSGModelHelpers::getGlobalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model)
285 auto *ctx = frameData.contextInterface();
286 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
287 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
288 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
289 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
290 return layer->getGlobalOpacity(*renderModel);
301float QSSGModelHelpers::getGlobalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model, QSSGPrepContextId prepId = QSSGPrepContextId::Invalid)
303 auto *ctx = frameData.contextInterface();
304 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
305 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return {});
306 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
307 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
308 return (prepId != QSSGPrepContextId::Invalid) ? layer->getGlobalOpacity(prepId, *renderModel) : layer->getGlobalOpacity(*renderModel);
316float QSSGModelHelpers::getLocalOpacity(
const QSSGFrameData &frameData, QSSGNodeId model)
319 auto *renderModel = QSSGRenderGraphObjectUtils::getNode<QSSGRenderModel>(model);
320 QSSG_ASSERT_X(renderModel && renderModel->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return {});
321 return renderModel->localOpacity;
331void QSSGModelHelpers::setGlobalTransform(
const QSSGFrameData &frameData,
332 QSSGRenderablesId renderablesId,
334 const QMatrix4x4 &transform)
336 auto *ctx = frameData.contextInterface();
337 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
338 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
339 auto *node = QSSGRenderGraphObjectUtils::getNode(model);
340 QSSG_ASSERT_X(node && node->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
341 const auto &renderModel =
static_cast<
const QSSGRenderModel &>(*node);
342 layer->setGlobalTransform(renderablesId, renderModel, transform);
352void QSSGModelHelpers::setGlobalOpacity(
const QSSGFrameData &frameData, QSSGRenderablesId renderablesId, QSSGNodeId model,
float opacity)
354 auto *ctx = frameData.contextInterface();
355 auto *layer = QSSGLayerRenderData::getCurrent(*ctx->renderer());
356 QSSG_ASSERT_X(layer,
"No active layer for renderer!",
return);
357 auto *node = QSSGRenderGraphObjectUtils::getNode(model);
358 QSSG_ASSERT_X(node && node->type == QSSGRenderGraphObject::Type::Model,
"Invalid model-id!",
return);
359 const auto &renderModel =
static_cast<
const QSSGRenderModel &>(*node);
360 layer->setGlobalOpacity(renderablesId, renderModel, opacity);
381QMatrix4x4 QSSGCameraHelpers::getViewProjectionMatrix(
const QSSGCameraId cameraId,
382 const QMatrix4x4 *globalTransform)
384 auto *renderCamera = QSSGRenderGraphObjectUtils::getCamera<QSSGRenderCamera>(cameraId);
385 QSSG_ASSERT(renderCamera && QSSGRenderGraphObject::isCamera(renderCamera->type),
return {});
387 QMatrix4x4 mat44{Qt::Uninitialized};
388 const auto &projection = renderCamera->projection;
389 const auto &transform = (globalTransform != 0) ? *globalTransform : renderCamera->localTransform;
390 QSSGRenderCamera::calculateViewProjectionMatrix(transform, projection, mat44);
416void QSSGRenderExtensionHelpers::registerRenderResult(
const QSSGFrameData &frameData,
417 QSSGExtensionId extension,
418 QRhiTexture *texture)
420 if (
auto *ext = QSSGRenderGraphObjectUtils::getExtension<QSSGRenderExtension>(extension)) {
421 const QSSGRenderContextInterface *ctx = frameData.contextInterface();
422 ctx->bufferManager()->registerExtensionResult(*ext, texture);