SLProject  4.2.000
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
AppDemoSceneShaderSkybox.cpp
Go to the documentation of this file.
1 /**
2  * \file AppDemoSceneShaderSkybox.cpp
3  * \brief Implementation for an SLScene inherited class
4  * \details For more info about App framework and the scene assembly see:
5  * https://cpvrlab.github.io/SLProject4/app-framework.html
6  * \date May 2024
7  * \authors Marcus Hudritsch, Marino von Wattenwyl
8  * \copyright http://opensource.org/licenses/GPL-3.0
9  * \remarks Please use clangformat to format the code. See more code style on
10  * https://github.com/cpvrlab/SLProject4/wiki/SLProject-Coding-Style
11 */
12 
14 #include <SLAssetLoader.h>
15 #include <SLLightSpot.h>
16 #include <SLLightDirect.h>
17 #include <SLSphere.h>
18 #include <SLSkybox.h>
19 #include <AppCommon.h>
20 
21 //-----------------------------------------------------------------------------
23  : SLScene("Image Based Lighting Test Scene")
24 {
25  info("Image-based lighting from skybox using high dynamic range images. "
26  "It uses the Cook-Torrance reflection model also to calculate the "
27  "ambient light part from the surrounding HDR skybox.");
28 }
29 //-----------------------------------------------------------------------------
30 //! All assets the should be loaded in parallel must be registered in here.
32 {
34  "Desert+X1024_C.jpg",
35  "Desert-X1024_C.jpg",
36  "Desert+Y1024_C.jpg",
37  "Desert-Y1024_C.jpg",
38  "Desert+Z1024_C.jpg",
39  "Desert-Z1024_C.jpg");
41  AppCommon::shaderPath + "Reflect.vert",
42  AppCommon::shaderPath + "Reflect.frag");
44  AppCommon::shaderPath + "RefractReflect.vert",
45  AppCommon::shaderPath + "RefractReflect.frag");
48  "FBX/Teapot/Teapot.fbx");
51  "FBX/Suzanne/Suzanne.fbx");
52 }
53 //-----------------------------------------------------------------------------
54 //! After parallel loading of the assets the scene gets assembled in here.
56 {
57 
58  // Material for mirror
59  SLMaterial* refl = new SLMaterial(am,
60  "refl",
63  1000,
64  1.0f);
66  refl->program(_spRefl);
67  // Material for glass
68  SLMaterial* refr = new SLMaterial(am,
69  "refr",
72  100,
73  0.1f,
74  0.9f,
75  1.5f);
76  refr->translucency(1000);
79  refr->program(_spRefr);
80 
81  // Create a scene group node
82  SLNode* scene = new SLNode("scene node");
83  this->root3D(scene);
84 
85  // Create camera in the center
86  SLCamera* cam1 = new SLCamera("Camera 1");
87  cam1->translation(0, 0, 5);
88  cam1->setInitialState();
89  scene->addChild(cam1);
90 
91  // There is no light needed in this scene. All reflections come from cube maps
92  // But ray tracing needs light sources
93  // Create directional light for the sunlight
94  SLLightDirect* light = new SLLightDirect(am, this, 0.5f);
95  light->ambientColor(SLCol4f(0.3f, 0.3f, 0.3f));
96  light->attenuation(1, 0, 0);
97  light->translate(1, 1, -1);
98  light->lookAt(-1, -1, 1);
99  scene->addChild(light);
100 
101  // Center sphere
102  SLNode* sphere = new SLNode(new SLSphere(am,
103  0.5f,
104  32,
105  32,
106  "Sphere",
107  refr));
108  scene->addChild(sphere);
109 
110  // configure teapot
111  _teapot->translate(-1.5f, -0.5f, 0);
112 
113  SLNode* teapot = _teapot->findChild<SLNode>("Teapot");
114  teapot->setMeshMat(refl, true);
115  scene->addChild(_teapot);
116 
117  // configure Suzanne
118  _suzanne->translate(1.5f, -0.5f, 0);
119  SLNode* suzanne = _suzanne->findChild<SLNode>("Suzanne");
120  suzanne->setMeshMat(refr, true);
121  scene->addChild(_suzanne);
122 
123  sv->camera(cam1);
124  this->skybox(_skybox);
125 
126  // Save energy
127  sv->doWaitOnIdle(true);
128 }
129 //-----------------------------------------------------------------------------
The AppCommon class holds the top-level instances of the app-demo.
Class declaration for an SLScene inherited class.
SLVec4< SLfloat > SLCol4f
Definition: SLVec4.h:237
static SLstring modelPath
Path to 3D models.
Definition: AppCommon.h:85
static SLstring shaderPath
Path to GLSL shader programs.
Definition: AppCommon.h:84
void registerAssetsToLoad(SLAssetLoader &al) override
All scene specific assets have to be registered for async loading in here.
void assemble(SLAssetManager *am, SLSceneView *sv) override
After parallel loading of the assets the scene gets assembled in here.
void addProgramToLoad(SLGLProgram *&program, const SLstring &vertShaderFile, const SLstring &fragShaderFile)
Add generic GLSL program with shader files to load.
void addSkyboxToLoad(SLSkybox *&skybox, const SLstring &path, SLVec2i resolution, SLstring name)
Add skybox with HDR texture to load.
void addNodeToLoad(SLNode *&node, const SLstring &modelPath, SLSkybox *skybox=nullptr, SLbool deleteTexImgAfterBuild=false, SLbool loadMeshesOnly=true, SLMaterial *overrideMat=nullptr, float ambientFactor=0.5f, SLbool forceCookTorranceRM=false, SLuint flags=SLProcess_Triangulate|SLProcess_JoinIdenticalVertices|SLProcess_RemoveRedundantMaterials|SLProcess_FindDegenerates|SLProcess_FindInvalidData|SLProcess_SplitLargeMeshes)
Add mesh from file to load via assimp loader.
Toplevel holder of the assets meshes, materials, textures and shaders.
Active or visible camera node class.
Definition: SLCamera.h:54
SLLightDirect class for a directional light source.
Definition: SLLightDirect.h:40
void ambientColor(const SLCol4f &ambi)
Definition: SLLight.h:105
void attenuation(const SLfloat kConstant, const SLfloat kLinear, const SLfloat kQuadratic)
Definition: SLLight.h:116
Defines a standard CG material with textures and a shader program.
Definition: SLMaterial.h:56
void translucency(SLfloat transl)
Definition: SLMaterial.h:176
void addTexture(SLGLTexture *texture)
Adds the passed texture to the equivalent texture type vector.
Definition: SLMaterial.cpp:348
void transmissive(const SLCol4f &transm)
Definition: SLMaterial.h:175
void program(SLGLProgram *sp)
Definition: SLMaterial.h:205
SLNode represents a node in a hierarchical scene graph.
Definition: SLNode.h:147
void addChild(SLNode *child)
Definition: SLNode.cpp:207
void translation(const SLVec3f &pos, SLTransformSpace relativeTo=TS_parent)
Definition: SLNode.cpp:828
T * findChild(const SLstring &name="", SLbool findRecursive=true)
Definition: SLNode.h:388
void setMeshMat(SLMaterial *mat, bool recursive)
Set the mesh material recursively.
Definition: SLNode.cpp:1172
void setInitialState()
Definition: SLNode.cpp:1084
void lookAt(SLfloat targetX, SLfloat targetY, SLfloat targetZ, SLfloat upX=0, SLfloat upY=1, SLfloat upZ=0, SLTransformSpace relativeTo=TS_world)
Definition: SLNode.h:652
void translate(const SLVec3f &vec, SLTransformSpace relativeTo=TS_object)
Definition: SLNode.cpp:906
The SLScene class represents the top level instance holding the scene structure.
Definition: SLScene.h:47
SLSkybox * skybox()
Definition: SLScene.h:101
SLNode * root3D()
Definition: SLScene.h:99
friend class SLNode
Definition: SLScene.h:48
SLstring & info()
Definition: SLScene.h:102
SceneView class represents a dynamic real time 3D view onto the scene.
Definition: SLSceneView.h:69
void camera(SLCamera *camera)
Definition: SLSceneView.h:145
void doWaitOnIdle(SLbool doWI)
Definition: SLSceneView.h:149
SLGLTexture * environmentCubemap()
Definition: SLSkybox.h:50
SLSphere creates a sphere mesh based on SLSpheric w. 180 deg polar angle.
Definition: SLSphere.h:33
static SLVec4 BLACK
Definition: SLVec4.h:213
static SLVec4 WHITE
Definition: SLVec4.h:215