6
6
#include < gtx/rotate_vector.hpp>
7
7
8
8
#include " ../../Graphic/Lighting/PointLight.h"
9
+ #include " ../../Graphic/Camera/Camera.h"
10
+ #include " ../../Graphic/Camera/PerspectiveCamera.h"
9
11
#include " ../../Time/Time.h"
10
12
#include " ../../Utility/ObjLoader.h"
11
13
#include " ../../Graphic/Renderer/MeshRenderer.h"
12
14
#include " ../../Graphic/Material/MaterialSetting.h"
15
+ #include " ../../Application.h"
13
16
14
- namespace {
15
- constexpr float UTAH_TEAPOT_SIZE = 1 .0f ; // 18.0f;
16
- unsigned int teapotIndex = 0 ;
17
- unsigned int lightCubeIndex = 0 ;
18
- }
17
+ namespace { MeshRenderer * lampRenderer; }
19
18
20
19
void DragonScene::init (unsigned int viewportWidth, unsigned int viewportHeight) {
21
20
FirstPersonScene::init (viewportWidth, viewportHeight);
22
21
23
22
// Cornell box.
24
23
Shape * cornell = ObjLoader::loadObjFile (" Assets\\ Models\\ cornell.obj" );
25
24
shapes.push_back (cornell);
26
- for (unsigned int i = 0 ; i < cornell->meshes .size (); ++i) {
27
- renderers.push_back (new MeshRenderer (&(cornell->meshes [i])));
28
- }
25
+ for (unsigned int i = 0 ; i < cornell->meshes .size (); ++i) renderers.push_back (new MeshRenderer (&(cornell->meshes [i])));
29
26
for (auto & r : renderers) {
30
27
r->transform .position -= glm::vec3 (0 .00f , 0 .0f , 0 );
31
28
r->transform .scale = glm::vec3 (0 .995f );
32
29
r->transform .updateTransformMatrix ();
33
30
}
34
- teapotIndex = renderers.size ();
35
-
36
- // Dragon.
37
- Shape * dragon = ObjLoader::loadObjFile (" Assets\\ Models\\ dragon.obj" );
38
- shapes.push_back (dragon);
39
- for (unsigned int i = 0 ; i < dragon->meshes .size (); ++i) {
40
- renderers.push_back (new MeshRenderer (&(dragon->meshes [i])));
41
- }
42
- lightCubeIndex = renderers.size ();
43
-
44
- // Light cube.
45
- Shape * lightCube = ObjLoader::loadObjFile (" Assets\\ Models\\ sphere.obj" );
46
- shapes.push_back (lightCube);
47
- for (unsigned int i = 0 ; i < lightCube->meshes .size (); ++i) {
48
- renderers.push_back (new MeshRenderer (&(lightCube->meshes [i])));
49
- }
50
-
51
- /*
52
- Shape * sponza = ObjLoader::loadObjFile("Assets\\Models\\sponza.obj");
53
- shapes.push_back(sponza);
54
- for (unsigned int i = 0; i < sponza->meshes.size(); ++i) {
55
- renderers.push_back(new MeshRenderer(&(sponza->meshes[i])));
56
- }
57
- */
58
31
59
- // Cornell box.
60
32
renderers[0 ]->materialSetting = MaterialSetting::Red (); // Green wall.
61
33
renderers[1 ]->materialSetting = MaterialSetting::White (); // Floor.
62
34
renderers[2 ]->materialSetting = MaterialSetting::White (); // Roof.
63
35
renderers[3 ]->materialSetting = MaterialSetting::Blue (); // Red wall.
64
- renderers[3 ]->tweakable = true ;
65
36
renderers[4 ]->materialSetting = MaterialSetting::White (); // White wall.
66
37
renderers[5 ]->materialSetting = MaterialSetting::White (); // Left box.
67
38
renderers[6 ]->materialSetting = MaterialSetting::White (); // Right box.
68
39
renderers[5 ]->enabled = false ; // Disable boxes.
69
40
renderers[6 ]->enabled = false ; // Disable boxes.
70
41
71
42
// Dragon.
72
- renderers[teapotIndex]->materialSetting = MaterialSetting::White ();
73
- renderers[teapotIndex]->materialSetting ->specularColor = glm::vec3 (1.0 , 0.9 , 0.15 );
74
- renderers[teapotIndex]->materialSetting ->diffuseColor = renderers[teapotIndex]->materialSetting ->specularColor ;
75
- renderers[teapotIndex]->materialSetting ->emissivity = 0 .0f ;
76
- renderers[teapotIndex]->materialSetting ->specularReflectivity = 1.0 ;
77
- renderers[teapotIndex]->materialSetting ->diffuseReflectivity = 0.0 ;
78
- renderers[teapotIndex]->materialSetting ->specularDiffusion = 4.5 ;
79
- renderers[teapotIndex]->tweakable = true ;
80
-
81
- // Dragon pot.
82
- for (unsigned int i = teapotIndex; i < renderers.size (); ++i) {
83
- auto & r = renderers[i];
84
- r->transform .scale = glm::vec3 (1 .5f );
85
- r->transform .rotation = glm::vec3 (0 , 1.0 , 0 );
86
- r->transform .position = glm::vec3 (0 , -0.3 , 0 );
87
- r->transform .updateTransformMatrix ();
43
+ int dragonIndex = renderers.size ();
44
+ Shape * dragon = ObjLoader::loadObjFile (" Assets\\ Models\\ dragon.obj" );
45
+ shapes.push_back (dragon);
46
+ for (unsigned int i = 0 ; i < dragon->meshes .size (); ++i) {
47
+ renderers.push_back (new MeshRenderer (&(dragon->meshes [i])));
88
48
}
89
-
90
- // Light cube.
91
- renderers[lightCubeIndex]->materialSetting = MaterialSetting::Emissive ();
92
- renderers[lightCubeIndex]->materialSetting ->diffuseColor .r = 1 .0f ;
93
- renderers[lightCubeIndex]->materialSetting ->diffuseColor .g = 1 .0f ;
94
- renderers[lightCubeIndex]->materialSetting ->diffuseColor .b = 1 .0f ;
95
- renderers[lightCubeIndex]->materialSetting ->emissivity = 2 .0f ;
96
- renderers[lightCubeIndex]->materialSetting ->specularReflectivity = 0 .0f ;
97
- renderers[lightCubeIndex]->materialSetting ->diffuseReflectivity = 0 .0f ;
98
-
99
- // Lighting.
49
+ auto * dragonRenderer = renderers[dragonIndex];
50
+ dragonRenderer->transform .scale = glm::vec3 (1 .79f );
51
+ dragonRenderer->transform .rotation = glm::vec3 (0 , 2.0 , 0 );
52
+ dragonRenderer->transform .position = glm::vec3 (-0 .09f , -0 .50f , 0 .01f );
53
+ dragonRenderer->transform .updateTransformMatrix ();
54
+ dragonRenderer->tweakable = true ;
55
+ dragonRenderer->name = " Dragon" ;
56
+ dragonRenderer->materialSetting = MaterialSetting::White ();
57
+
58
+ auto * dragonMaterialSetting = dragonRenderer->materialSetting ;
59
+ dragonMaterialSetting->specularColor = glm::vec3 (0.95 , 1 , 0.95 );
60
+ dragonMaterialSetting->diffuseColor = dragonMaterialSetting->specularColor ;
61
+ dragonMaterialSetting->emissivity = 0 .00f ;
62
+ dragonMaterialSetting->transparency = 0 .00f ;
63
+ dragonMaterialSetting->refractiveIndex = 1 .18f ;
64
+ dragonMaterialSetting->specularReflectivity = 1 .00f ;
65
+ dragonMaterialSetting->diffuseReflectivity = 0 .0f ;
66
+ dragonMaterialSetting->specularDiffusion = 2 .0f ;
67
+
68
+ // Light.
69
+ Shape * light = ObjLoader::loadObjFile (" Assets\\ Models\\ quad.obj" );
70
+ shapes.push_back (light);
71
+ lampRenderer = new MeshRenderer (&(light->meshes [0 ]));
72
+ renderers.push_back (lampRenderer);
73
+
74
+ lampRenderer->materialSetting = MaterialSetting::Emissive ();
75
+ lampRenderer->materialSetting ->diffuseColor .r = 1 .f ;
76
+ lampRenderer->materialSetting ->diffuseColor .g = 1 .f ;
77
+ lampRenderer->materialSetting ->diffuseColor .b = 1 .f ;
78
+ lampRenderer->materialSetting ->emissivity = 1 .0f ;
79
+ lampRenderer->materialSetting ->specularReflectivity = 0 .0f ;
80
+ lampRenderer->materialSetting ->diffuseReflectivity = 1 .0f ;
81
+
82
+ lampRenderer->transform .position = glm::vec3 (0 , 0.975 , 0 );
83
+ lampRenderer->transform .rotation = glm::vec3 (-3.1414 * 0.5 , 3.1414 * 0.5 , 0 );
84
+ lampRenderer->transform .scale = glm::vec3 (0 .14f , 0 .34f , 1 .0f );
85
+ lampRenderer->transform .updateTransformMatrix ();
86
+ lampRenderer->name = " Ceiling lamp" ;
87
+
88
+ // Point light.
100
89
PointLight p;
101
- p.color = glm::vec3 (0 .75f , 0 .1f , 0 .1f );
90
+ p.color = glm::vec3 (0.5 );
91
+ p.position = lampRenderer->transform .position - glm::vec3 (0 , 0.2 , 0 );
102
92
pointLights.push_back (p);
103
- pointLights[0 ].color = glm::vec3 (1 .4f , 0 .9f , 0 .35f );
104
- pointLights[0 ].color = normalize (pointLights[0 ].color );
105
93
}
106
94
107
95
void DragonScene::update () {
108
96
FirstPersonScene::update ();
109
97
110
- glm::vec3 r = glm::vec3 (sinf (float (Time::time * 0.97 )), sinf (float (Time::time * 0.45 )), sinf (float (Time::time * 0.32 )));
111
-
112
- // Lighting.
113
- renderers[lightCubeIndex]->transform .position = glm::vec3 (0 , 0.5 , 0 ) + r * 0 .1f ;
114
- renderers[lightCubeIndex]->transform .position .x *= 4 .5f ;
115
- renderers[lightCubeIndex]->transform .position .z *= 4 .5f ;
116
- renderers[lightCubeIndex]->transform .rotation = r;
117
- renderers[lightCubeIndex]->transform .scale = glm::vec3 (0 .049f );
118
- renderers[lightCubeIndex]->transform .updateTransformMatrix ();
119
- pointLights[0 ].position = renderers[lightCubeIndex]->transform .position ;
120
- renderers[lightCubeIndex]->materialSetting ->diffuseColor = pointLights[0 ].color ;
98
+ glm::vec3 col = pointLights[0 ].color ;
99
+ float m = col.r ;
100
+ m = glm::max (m, col.b );
101
+ m = glm::max (m, col.g );
102
+
103
+ lampRenderer->materialSetting ->diffuseColor = col /= m;
104
+ lampRenderer->materialSetting ->emissivity = 2 * m;
121
105
}
122
106
123
107
DragonScene::~DragonScene () {
124
- for (auto * r : renderers) delete r;
125
108
for (auto * s : shapes) delete s;
109
+ for (auto * r : renderers) delete r;
126
110
}
0 commit comments