1 /*
2  * This file is part of the Colobot: Gold Edition source code
3  * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam
4  * http://epsitec.ch; http://colobot.info; http://github.com/colobot
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see http://gnu.org/licenses
18  */
19 
20 /**
21  * \file graphics/core/light.h
22  * \brief Light struct and related enums
23  */
24 
25 #pragma once
26 
27 
28 #include "graphics/core/color.h"
29 
30 #include "math/vector.h"
31 
32 
33 // Graphics module namespace
34 namespace Gfx
35 {
36 
37 /**
38  * \enum LightType
39  * \brief Type of light in 3D scene
40  */
41 enum LightType
42 {
43     LIGHT_POINT,
44     LIGHT_SPOT,
45     LIGHT_DIRECTIONAL
46 };
47 
48 /**
49  * \struct Light
50  * \brief Properties of light in 3D scene
51  *
52  * This structure was created as analog to DirectX's D3DLIGHT.
53  */
54 struct Light
55 {
56     //! Type of light source
57     LightType  type = LIGHT_POINT;
58     //! Color of ambient light
59     Color      ambient = Color(0.4f, 0.4f, 0.4f);
60     //! Color of diffuse light
61     Color      diffuse = Color(0.8f, 0.8f, 0.8f);
62     //! Color of specular light
63     Color      specular = Color(1.0f, 1.0f, 1.0f);
64     //! Position in world space (for point & spot lights)
65     Math::Vector    position = Math::Vector(0.0f, 0.0f, 0.0f);
66     //! Direction in world space (for directional & spot lights)
67     Math::Vector    direction = Math::Vector(0.0f, 0.0f, 1.0f);
68     //! Constant attenuation factor
69     float           attenuation0 = 1.0f;
70     //! Linear attenuation factor
71     float           attenuation1 = 0.0f;
72     //! Quadratic attenuation factor
73     float           attenuation2 = 0.0f;
74     //! Angle of spotlight cone (0-PI/2 radians)
75     float           spotAngle = Math::PI/2.0f;
76     //! Intensity of spotlight (0 = uniform; 128 = most intense)
77     float           spotIntensity = 0.0f;
78 
79     //! Loads default values
LoadDefaultLight80     void LoadDefault()
81     {
82         *this = Light();
83     }
84 };
85 
86 
87 } // namespace Gfx
88 
89