Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added vsg::SoftShadows and vsg::Percentage CloserSoftShadows support. #1144

Merged
merged 23 commits into from
Apr 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
aecf59e
Include inverse shadow matrix in light data
AnyOldName3 Mar 11, 2024
9fc5a45
Merge branch 'inverse-shadow-matrix' of https://github.com/AnyOldName…
robertosfield Mar 16, 2024
27373f6
Merge branch 'master' into soft-shadows
robertosfield Mar 27, 2024
151b839
Added radius member ot PointLight and SpotLight
robertosfield Mar 27, 2024
57f0409
Updates to use the new ShadowSettings structure.
robertosfield Mar 27, 2024
085eda3
Added initla ShadowSettings subclasses
robertosfield Mar 27, 2024
ce15f57
Created new include/vsg/lighting subdirectory for vsg::Light and vsg:…
robertosfield Mar 27, 2024
c0ab477
Ran clang-format
robertosfield Mar 27, 2024
d2c6e8e
Added support for lighting subdirectory
robertosfield Mar 27, 2024
f414b14
Moved the ShadowSettings into sperate header/source
robertosfield Mar 27, 2024
78bf28f
Moved the Light subclasses out into their own header/source files
robertosfield Mar 27, 2024
a36cb5a
Moved ShadowSettings subclasses out into their own header/souce files
robertosfield Mar 27, 2024
925ed91
Added read/write/compare and copy constructors for ShadowSttings subc…
robertosfield Mar 27, 2024
2414022
Renamed ShadowSettings::shadowMaps to shadowMapCount
robertosfield Mar 27, 2024
2571b32
Ran clang-format
robertosfield Mar 27, 2024
2d5ce8e
Merge branch 'StorageBuffer' into soft-shadows
robertosfield Mar 29, 2024
2fa9f04
Merge branch 'master' into soft-shadows
robertosfield Mar 30, 2024
b588555
Simplfied shadow setup so that for all shadowing types the lightData …
robertosfield Mar 31, 2024
00812a8
Updated built-in Shaders
robertosfield Apr 1, 2024
06258f0
Added ViewDependentState::shadowSettingsOverride map and ViewDependen…
robertosfield Apr 2, 2024
ba2711d
Updated build-in ShaderSets
robertosfield Apr 2, 2024
23ea0df
Updated built-in ShaderSet
robertosfield Apr 2, 2024
2c2213f
Updated built-in ShaderSets
robertosfield Apr 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.7)

project(vsg
VERSION 1.1.2
VERSION 1.1.3
DESCRIPTION "VulkanSceneGraph library"
LANGUAGES CXX
)
Expand Down
2 changes: 2 additions & 0 deletions cmake/build_all_h.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ macro(BUILD_ALL_H)
file(GLOB MATHS_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/maths/*.h )
file(GLOB NODES_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/nodes/*.h )
file(GLOB ANIMATION_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/animation/*.h )
file(GLOB LIGHTING_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/lighting/*.h )
file(GLOB THREADING_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/threading/*.h )
file(GLOB UI_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/ui/*.h )
file(GLOB UTILS_HEADERS RELATIVE ${INCLUDE_DIR} ${INCLUDE_DIR}/vsg/utils/*.h )
Expand All @@ -35,6 +36,7 @@ macro(BUILD_ALL_H)
APPEND_INCLUDES(ALL_H_CONTENTS MATHS_HEADERS "// Maths header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS NODES_HEADERS "// Node header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS ANIMATION_HEADERS "// Animation header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS LIGHTING_HEADERS "// Lighting header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS COMMANDS_HEADERS "// Commands header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS STATE_HEADERS "// State header files\n")
APPEND_INCLUDES(ALL_H_CONTENTS THREADING_HEADERS "// Threading header files\n")
Expand Down
12 changes: 11 additions & 1 deletion include/vsg/all.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
#include <vsg/nodes/InstrumentationNode.h>
#include <vsg/nodes/LOD.h>
#include <vsg/nodes/Layer.h>
#include <vsg/nodes/Light.h>
#include <vsg/nodes/MatrixTransform.h>
#include <vsg/nodes/Node.h>
#include <vsg/nodes/PagedLOD.h>
Expand All @@ -90,6 +89,17 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
#include <vsg/animation/MorphSampler.h>
#include <vsg/animation/TransformSampler.h>

// Lighting header files
#include <vsg/lighting/AmbientLight.h>
#include <vsg/lighting/DirectionalLight.h>
#include <vsg/lighting/HardShadows.h>
#include <vsg/lighting/Light.h>
#include <vsg/lighting/PercentageCloserSoftShadows.h>
#include <vsg/lighting/PointLight.h>
#include <vsg/lighting/ShadowSettings.h>
#include <vsg/lighting/SoftShadows.h>
#include <vsg/lighting/SpotLight.h>

// Commands header files
#include <vsg/commands/BeginQuery.h>
#include <vsg/commands/BindIndexBuffer.h>
Expand Down
40 changes: 40 additions & 0 deletions include/vsg/lighting/AmbientLight.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/Light.h>
#include <vsg/maths/common.h>
#include <vsg/nodes/Node.h>

namespace vsg
{

/// AmbientLight represents an ambient light source
class VSG_DECLSPEC AmbientLight : public Inherit<Light, AmbientLight>
{
public:
AmbientLight();
AmbientLight(const AmbientLight& rhs, const CopyOp& copyop = {});

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return AmbientLight::create(*this, copyop); }

void read(Input& input) override;
void write(Output& output) const override;

protected:
virtual ~AmbientLight() {}
};
VSG_type_name(vsg::AmbientLight);

} // namespace vsg
44 changes: 44 additions & 0 deletions include/vsg/lighting/DirectionalLight.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/Light.h>
#include <vsg/maths/common.h>
#include <vsg/nodes/Node.h>

namespace vsg
{

/// DirectionalLight represents a directional light source - used for light sources that are treated as if at infinite distance, like sun/moon.
class VSG_DECLSPEC DirectionalLight : public Inherit<Light, DirectionalLight>
{
public:
DirectionalLight();
DirectionalLight(const DirectionalLight& rhs, const CopyOp& copyop = {});

dvec3 direction = dvec3(0.0, 0.0, -1.0);
float angleSubtended = 0.0090f;

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return DirectionalLight::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;

protected:
virtual ~DirectionalLight() {}
};
VSG_type_name(vsg::DirectionalLight);

} // namespace vsg
35 changes: 35 additions & 0 deletions include/vsg/lighting/HardShadows.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/ShadowSettings.h>

namespace vsg
{

class VSG_DECLSPEC HardShadows : public Inherit<ShadowSettings, HardShadows>
{
public:
explicit HardShadows(uint32_t in_shadowMaps = 1);
HardShadows(const HardShadows& rhs, const CopyOp& copyop = {});

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return HardShadows::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;
};
VSG_type_name(vsg::HardShadows);

} // namespace vsg
51 changes: 51 additions & 0 deletions include/vsg/lighting/Light.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2022 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/ShadowSettings.h>
#include <vsg/maths/common.h>
#include <vsg/nodes/Node.h>

namespace vsg
{

/// Light is a base node class for different light types - AmbientLight, DirectionalLight, PointLight and SpotLight.
/// Used by the RecordTraversal to represent a light source that is placed in the LightData uniform used by the shaders when implementing lighting.
/// Provides name, color and intensity settings common to all Light types.
class VSG_DECLSPEC Light : public Inherit<Node, Light>
{
public:
Light();
Light(const Light& rhs, const CopyOp& copyop = {});

std::string name;
vec3 color = vec3(1.0f, 1.0f, 1.0f);
float intensity = 1.0f;
ref_ptr<ShadowSettings> shadowSettings;

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return Light::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;

protected:
virtual ~Light() {}
};
VSG_type_name(vsg::Light);

/// convenience method for creating a subgraph with a headlight illumination using a white AmbientLight and DirectionalLight with intensity of 0.05 and 0.95 respectively.
extern VSG_DECLSPEC ref_ptr<vsg::Node> createHeadlight();

} // namespace vsg
35 changes: 35 additions & 0 deletions include/vsg/lighting/PercentageCloserSoftShadows.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/ShadowSettings.h>

namespace vsg
{

class VSG_DECLSPEC PercentageCloserSoftShadows : public Inherit<ShadowSettings, PercentageCloserSoftShadows>
{
public:
explicit PercentageCloserSoftShadows(uint32_t in_shadowMaps = 1);
PercentageCloserSoftShadows(const PercentageCloserSoftShadows& rhs, const CopyOp& copyop = {});

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return PercentageCloserSoftShadows::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;
};
VSG_type_name(vsg::PercentageCloserSoftShadows);

} // namespace vsg
44 changes: 44 additions & 0 deletions include/vsg/lighting/PointLight.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/Light.h>
#include <vsg/maths/common.h>
#include <vsg/nodes/Node.h>

namespace vsg
{

/// PointLight represents a local point light source where all light radiants event from the light position.
class VSG_DECLSPEC PointLight : public Inherit<Light, PointLight>
{
public:
PointLight();
PointLight(const PointLight& rhs, const CopyOp& copyop = {});

dvec3 position = dvec3(0.0, 0.0, 0.0);
double radius = 0.0f;

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return PointLight::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;

protected:
virtual ~PointLight() {}
};
VSG_type_name(vsg::PointLight);

} // namespace vsg
40 changes: 40 additions & 0 deletions include/vsg/lighting/ShadowSettings.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/core/Inherit.h>

namespace vsg
{

class VSG_DECLSPEC ShadowSettings : public Inherit<Object, ShadowSettings>
{
public:
explicit ShadowSettings(uint32_t shadowMaps = 1);
ShadowSettings(const ShadowSettings& rhs, const CopyOp& copyop = {});

uint32_t shadowMapCount = 1;

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return ShadowSettings::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;

protected:
virtual ~ShadowSettings() {}
};
VSG_type_name(vsg::ShadowSettings);

} // namespace vsg
37 changes: 37 additions & 0 deletions include/vsg/lighting/SoftShadows.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#pragma once

/* <editor-fold desc="MIT License">

Copyright(c) 2024 Robert Osfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

</editor-fold> */

#include <vsg/lighting/ShadowSettings.h>

namespace vsg
{

class VSG_DECLSPEC SoftShadows : public Inherit<ShadowSettings, SoftShadows>
{
public:
explicit SoftShadows(uint32_t in_shadowMaps = 1, float in_penumbraRadius = 0.05f);
SoftShadows(const SoftShadows& rhs, const CopyOp& copyop = {});

float penumbraRadius = 0.05f;

public:
ref_ptr<Object> clone(const CopyOp& copyop = {}) const override { return SoftShadows::create(*this, copyop); }
int compare(const Object& rhs) const override;

void read(Input& input) override;
void write(Output& output) const override;
};
VSG_type_name(vsg::SoftShadows);

} // namespace vsg
Loading
Loading