2026-06-04 19:34:51 +10:00
|
|
|
/********************************************************************************
|
|
|
|
|
* *
|
|
|
|
|
* This file is part of IfcOpenShell. *
|
|
|
|
|
* *
|
|
|
|
|
* IfcOpenShell is free software: you can redistribute it and/or modify *
|
|
|
|
|
* it under the terms of the Lesser GNU General Public License as published by *
|
|
|
|
|
* the Free Software Foundation, either version 3.0 of the License, or *
|
|
|
|
|
* (at your option) any later version. *
|
|
|
|
|
* *
|
|
|
|
|
* IfcOpenShell is distributed in the hope that it will be useful, *
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
|
|
|
* Lesser GNU General Public License for more details. *
|
|
|
|
|
* *
|
|
|
|
|
* You should have received a copy of the Lesser GNU General Public License *
|
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
|
|
|
|
* *
|
|
|
|
|
********************************************************************************/
|
|
|
|
|
|
|
|
|
|
#ifndef VIEWPORTCORE_H
|
|
|
|
|
#define VIEWPORTCORE_H
|
|
|
|
|
|
2026-06-05 09:39:57 +10:00
|
|
|
// Platform-agnostic render core. Owns the wgpu lifecycle state +
|
|
|
|
|
// (eventually) scene state + per-frame render path. Talks to its
|
|
|
|
|
// embedder through ViewportHost (window/canvas surface, scheduling,
|
|
|
|
|
// notifications) — has no Qt or browser dependencies of its own.
|
2026-06-04 19:34:51 +10:00
|
|
|
//
|
2026-06-05 09:39:57 +10:00
|
|
|
// First migration target (#84-a): wgpu instance/adapter/device/queue/
|
|
|
|
|
// surface ownership. The next subsystems (pipelines, models, render
|
|
|
|
|
// path) move incrementally across subsequent commits — each leaving
|
|
|
|
|
// the desktop build green. ViewportWindow currently holds reference
|
|
|
|
|
// members pointing back at ViewportCore's storage so its body doesn't
|
|
|
|
|
// have to acquire a `core_.` prefix on every wgpu touch. Those
|
|
|
|
|
// references shrink as render methods themselves move over.
|
|
|
|
|
|
|
|
|
|
#include <webgpu/webgpu.h>
|
2026-06-04 19:34:51 +10:00
|
|
|
|
|
|
|
|
#include "ViewportHost.h"
|
|
|
|
|
|
|
|
|
|
class ViewportCore {
|
|
|
|
|
public:
|
|
|
|
|
explicit ViewportCore(ViewportHost* host);
|
|
|
|
|
~ViewportCore();
|
|
|
|
|
|
|
|
|
|
ViewportCore(const ViewportCore&) = delete;
|
|
|
|
|
ViewportCore& operator=(const ViewportCore&) = delete;
|
|
|
|
|
|
|
|
|
|
ViewportHost* host() const { return host_; }
|
|
|
|
|
|
2026-06-05 09:39:57 +10:00
|
|
|
// Friend access for ViewportWindow's reference proxies. As each
|
|
|
|
|
// render method moves into ViewportCore it stops needing these
|
|
|
|
|
// (it touches the fields directly); once everything has migrated
|
|
|
|
|
// the friend declaration goes away.
|
|
|
|
|
friend class ViewportWindow;
|
|
|
|
|
|
2026-06-04 19:34:51 +10:00
|
|
|
private:
|
|
|
|
|
ViewportHost* host_;
|
2026-06-05 09:39:57 +10:00
|
|
|
|
|
|
|
|
// ---- wgpu lifecycle state ------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Plain pointers (wgpu C handles); zero-init means "not yet
|
|
|
|
|
// initialised". Owned by ViewportCore now; reference members in
|
|
|
|
|
// ViewportWindow alias these so the existing call sites don't
|
|
|
|
|
// need to change to use a `core_.` prefix.
|
|
|
|
|
WGPUInstance instance_ = nullptr;
|
|
|
|
|
WGPUAdapter adapter_ = nullptr;
|
|
|
|
|
WGPUDevice device_ = nullptr;
|
|
|
|
|
WGPUQueue queue_ = nullptr;
|
|
|
|
|
WGPUSurface surface_ = nullptr;
|
|
|
|
|
WGPUTextureFormat surface_format_ = WGPUTextureFormat_Undefined;
|
|
|
|
|
bool surface_configured_ = false;
|
2026-06-05 09:57:59 +10:00
|
|
|
|
|
|
|
|
// ---- Pipelines + bind-group layouts (built once after init) -------------
|
|
|
|
|
//
|
|
|
|
|
// Main render pipeline group: one shader module + two bind group
|
|
|
|
|
// layouts (frame uniforms at group=0, per-model storages at
|
|
|
|
|
// group=1) feeding both the opaque-pass pipeline and the
|
|
|
|
|
// transparent-pass variant. The transparent pipeline shares the
|
|
|
|
|
// shader and layout; it differs only in depthWriteEnabled=False
|
|
|
|
|
// and the SrcAlpha / OneMinusSrcAlpha blend on the color target.
|
|
|
|
|
WGPUShaderModule main_shader_module_ = nullptr;
|
|
|
|
|
WGPUBindGroupLayout frame_bgl_ = nullptr; // group 0
|
|
|
|
|
WGPUBindGroupLayout model_bgl_ = nullptr; // group 1
|
|
|
|
|
WGPUPipelineLayout pipeline_layout_ = nullptr;
|
|
|
|
|
WGPURenderPipeline main_pipeline_ = nullptr;
|
|
|
|
|
WGPURenderPipeline main_pipeline_transparent_ = nullptr;
|
|
|
|
|
|
|
|
|
|
// HiZ occlusion-cull pipeline group. Downsamples MSAA depth into a
|
|
|
|
|
// mip pyramid; consumed by next-frame cull.
|
|
|
|
|
WGPUShaderModule hiz_shader_module_ = nullptr;
|
|
|
|
|
WGPUBindGroupLayout hiz_bgl_ = nullptr;
|
|
|
|
|
WGPUPipelineLayout hiz_pipeline_layout_ = nullptr;
|
|
|
|
|
WGPURenderPipeline hiz_pipeline_ = nullptr;
|
|
|
|
|
|
|
|
|
|
// Edge-silhouette pipeline group. Drawn after the main pass; reads
|
|
|
|
|
// the depth/normal attachments to emit dark outlines.
|
|
|
|
|
WGPUShaderModule edge_shader_module_ = nullptr;
|
|
|
|
|
WGPUBindGroupLayout edge_bgl_ = nullptr;
|
|
|
|
|
WGPUPipelineLayout edge_pipeline_layout_ = nullptr;
|
|
|
|
|
WGPURenderPipeline edge_pipeline_ = nullptr;
|
|
|
|
|
|
|
|
|
|
// Pick pass. Reuses pipeline_layout_ — same set of bindings as the
|
|
|
|
|
// main pass since the pick fragment also vertex-pulls instance data.
|
|
|
|
|
WGPURenderPipeline pick_pipeline_ = nullptr;
|
2026-06-04 19:34:51 +10:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // VIEWPORTCORE_H
|