VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
scene.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3//
4// Created by Arnis Lektauers on 09.10.2025.
5//
6#include "scene.h"
7
8#include <cstring>
9
11
12namespace visutwin::canvas
13{
14 Scene::Scene(const std::shared_ptr<GraphicsDevice>& graphicsDevice) : _device(graphicsDevice), _lighting()
15 {
16 _sky = std::make_unique<Sky>(_device, this);
17 }
18
19 void Scene::setSkyboxMip(int value)
20 {
21 if (value != _skyboxMip) {
22 _skyboxMip = value;
23 resetSkyMesh();
24 }
25 }
26
27 void Scene::resetSkyMesh()
28 {
29 if (!_sky) {
30 return;
31 }
32 _sky->resetSkyMesh();
33 _sky->updateSkyMesh();
34 _updateShaders = true;
35 }
36
37 void Scene::setLayers(const std::shared_ptr<LayerComposition>& layers)
38 {
39 auto prev = _layers;
40 _layers = layers;
41 if (_sky) {
42 _sky->updateSkyMesh();
43 }
45 }
46
47 void Scene::setSkyboxIntensity(float value) {
48 if (value != _skyboxIntensity) {
49 _skyboxIntensity = value;
50 resetSkyMesh();
51 }
52 }
53
54 void Scene::setSkyType(const int value)
55 {
56 if (value != _skyType) {
57 _skyType = value;
58 if (_sky) {
59 _sky->setType(value);
60 }
61 resetSkyMesh();
62 }
63 }
64
66 {
67 if (value != _envAtlas) {
68 _envAtlas = value;
69
70 // Make sure required options are set up on the texture
71 if (value) {
76 value->setMipmaps(false);
77 }
78
79 _prefilteredCubemaps.clear();
80 if (_internalEnvAtlas) {
81 delete _internalEnvAtlas;
82 _internalEnvAtlas = nullptr;
83 }
84
85 resetSkyMesh();
86 }
87 }
88
90 {
91 if (value != _skyboxCubeMap) {
92 _skyboxCubeMap = value;
93 resetSkyMesh();
94 }
95 }
96
97 void Scene::setAtmosphereUniforms(const void* data, const size_t size)
98 {
99 if (data && size <= sizeof(_atmosphereUniforms)) {
100 std::memcpy(&_atmosphereUniforms, data, size);
101 }
102 }
103
104 void Scene::setPrefilteredCubemaps(const std::vector<Texture*>& cubemaps)
105 {
106 _prefilteredCubemaps = cubemaps;
107
108 // DEVIATION: generatePrefilteredAtlas (from pre-filtered cubemaps) is not yet ported.
109 // When needed, it will be added to EnvLighting. For now, only generateAtlas (from
110 // equirectangular HDR source) is implemented.
111 (void)_internalEnvAtlas;
112 }
113}
EventHandler * fire(const std::string &name, Args &&... args)
void setLayers(const std::shared_ptr< LayerComposition > &layers)
Definition scene.cpp:37
void setPrefilteredCubemaps(const std::vector< Texture * > &cubemaps)
Definition scene.cpp:104
void setSkyboxIntensity(float value)
Definition scene.cpp:47
void setAtmosphereUniforms(const void *data, size_t size)
Definition scene.cpp:97
void setSkybox(Texture *value)
Definition scene.cpp:89
Scene(const std::shared_ptr< GraphicsDevice > &graphicsDevice)
Definition scene.cpp:14
void setSkyType(int value)
Definition scene.cpp:54
void setEnvAtlas(Texture *value)
Definition scene.cpp:65
const std::shared_ptr< LayerComposition > & layers() const
Definition scene.h:40
static constexpr const char * EVENT_SETLAYERS
Definition scene.h:31
void setSkyboxMip(int value)
Definition scene.cpp:19
GPU texture resource supporting 2D, cubemap, volume, and array formats with mipmap management.
Definition texture.h:57
void setMinFilter(FilterMode filter)
Definition texture.cpp:271
void setMipmaps(bool mipmaps)
Definition texture.cpp:260
void setAddressU(AddressMode address)
Definition texture.cpp:295
void setMagFilter(FilterMode filter)
Definition texture.cpp:283
void setAddressV(AddressMode address)
Definition texture.cpp:303