1 | /********************************************************************************************** |
2 | * |
3 | * raylib.lights - Some useful functions to deal with lights data |
4 | * |
5 | * CONFIGURATION: |
6 | * |
7 | * #define RLIGHTS_IMPLEMENTATION |
8 | * Generates the implementation of the library into the included file. |
9 | * If not defined, the library is in header only mode and can be included in other headers |
10 | * or source files without problems. But only ONE file should hold the implementation. |
11 | * |
12 | * LICENSE: zlib/libpng |
13 | * |
14 | * Copyright (c) 2017-2019 Victor Fisac (@victorfisac) and Ramon Santamaria (@raysan5) |
15 | * |
16 | * This software is provided "as-is", without any express or implied warranty. In no event |
17 | * will the authors be held liable for any damages arising from the use of this software. |
18 | * |
19 | * Permission is granted to anyone to use this software for any purpose, including commercial |
20 | * applications, and to alter it and redistribute it freely, subject to the following restrictions: |
21 | * |
22 | * 1. The origin of this software must not be misrepresented; you must not claim that you |
23 | * wrote the original software. If you use this software in a product, an acknowledgment |
24 | * in the product documentation would be appreciated but is not required. |
25 | * |
26 | * 2. Altered source versions must be plainly marked as such, and must not be misrepresented |
27 | * as being the original software. |
28 | * |
29 | * 3. This notice may not be removed or altered from any source distribution. |
30 | * |
31 | **********************************************************************************************/ |
32 | |
33 | #ifndef RLIGHTS_H |
34 | #define RLIGHTS_H |
35 | |
36 | //---------------------------------------------------------------------------------- |
37 | // Defines and Macros |
38 | //---------------------------------------------------------------------------------- |
39 | #define MAX_LIGHTS 4 // Max dynamic lights supported by shader |
40 | |
41 | //---------------------------------------------------------------------------------- |
42 | // Types and Structures Definition |
43 | //---------------------------------------------------------------------------------- |
44 | |
45 | // Light data |
46 | typedef struct { |
47 | int type; |
48 | Vector3 position; |
49 | Vector3 target; |
50 | Color color; |
51 | bool enabled; |
52 | |
53 | // Shader locations |
54 | int enabledLoc; |
55 | int typeLoc; |
56 | int posLoc; |
57 | int targetLoc; |
58 | int colorLoc; |
59 | } Light; |
60 | |
61 | // Light type |
62 | typedef enum { |
63 | LIGHT_DIRECTIONAL, |
64 | LIGHT_POINT |
65 | } LightType; |
66 | |
67 | #ifdef __cplusplus |
68 | extern "C" { // Prevents name mangling of functions |
69 | #endif |
70 | |
71 | //---------------------------------------------------------------------------------- |
72 | // Module Functions Declaration |
73 | //---------------------------------------------------------------------------------- |
74 | Light CreateLight(int type, Vector3 position, Vector3 target, Color color, Shader shader); // Create a light and get shader locations |
75 | void UpdateLightValues(Shader shader, Light light); // Send light properties to shader |
76 | |
77 | #ifdef __cplusplus |
78 | } |
79 | #endif |
80 | |
81 | #endif // RLIGHTS_H |
82 | |
83 | |
84 | /*********************************************************************************** |
85 | * |
86 | * RLIGHTS IMPLEMENTATION |
87 | * |
88 | ************************************************************************************/ |
89 | |
90 | #if defined(RLIGHTS_IMPLEMENTATION) |
91 | |
92 | #include "raylib.h" |
93 | |
94 | //---------------------------------------------------------------------------------- |
95 | // Defines and Macros |
96 | //---------------------------------------------------------------------------------- |
97 | // ... |
98 | |
99 | //---------------------------------------------------------------------------------- |
100 | // Types and Structures Definition |
101 | //---------------------------------------------------------------------------------- |
102 | // ... |
103 | |
104 | //---------------------------------------------------------------------------------- |
105 | // Global Variables Definition |
106 | //---------------------------------------------------------------------------------- |
107 | static int lightsCount = 0; // Current amount of created lights |
108 | |
109 | //---------------------------------------------------------------------------------- |
110 | // Module specific Functions Declaration |
111 | //---------------------------------------------------------------------------------- |
112 | // ... |
113 | |
114 | //---------------------------------------------------------------------------------- |
115 | // Module Functions Definition |
116 | //---------------------------------------------------------------------------------- |
117 | |
118 | // Create a light and get shader locations |
119 | Light CreateLight(int type, Vector3 position, Vector3 target, Color color, Shader shader) |
120 | { |
121 | Light light = { 0 }; |
122 | |
123 | if (lightsCount < MAX_LIGHTS) |
124 | { |
125 | light.enabled = true; |
126 | light.type = type; |
127 | light.position = position; |
128 | light.target = target; |
129 | light.color = color; |
130 | |
131 | // TODO: Below code doesn't look good to me, |
132 | // it assumes a specific shader naming and structure |
133 | // Probably this implementation could be improved |
134 | char enabledName[32] = "lights[x].enabled\0" ; |
135 | char typeName[32] = "lights[x].type\0" ; |
136 | char posName[32] = "lights[x].position\0" ; |
137 | char targetName[32] = "lights[x].target\0" ; |
138 | char colorName[32] = "lights[x].color\0" ; |
139 | |
140 | // Set location name [x] depending on lights count |
141 | enabledName[7] = '0' + lightsCount; |
142 | typeName[7] = '0' + lightsCount; |
143 | posName[7] = '0' + lightsCount; |
144 | targetName[7] = '0' + lightsCount; |
145 | colorName[7] = '0' + lightsCount; |
146 | |
147 | light.enabledLoc = GetShaderLocation(shader, enabledName); |
148 | light.typeLoc = GetShaderLocation(shader, typeName); |
149 | light.posLoc = GetShaderLocation(shader, posName); |
150 | light.targetLoc = GetShaderLocation(shader, targetName); |
151 | light.colorLoc = GetShaderLocation(shader, colorName); |
152 | |
153 | UpdateLightValues(shader, light); |
154 | |
155 | lightsCount++; |
156 | } |
157 | |
158 | return light; |
159 | } |
160 | |
161 | // Send light properties to shader |
162 | // NOTE: Light shader locations should be available |
163 | void UpdateLightValues(Shader shader, Light light) |
164 | { |
165 | // Send to shader light enabled state and type |
166 | SetShaderValue(shader, light.enabledLoc, &light.enabled, UNIFORM_INT); |
167 | SetShaderValue(shader, light.typeLoc, &light.type, UNIFORM_INT); |
168 | |
169 | // Send to shader light position values |
170 | float position[3] = { light.position.x, light.position.y, light.position.z }; |
171 | SetShaderValue(shader, light.posLoc, position, UNIFORM_VEC3); |
172 | |
173 | // Send to shader light target position values |
174 | float target[3] = { light.target.x, light.target.y, light.target.z }; |
175 | SetShaderValue(shader, light.targetLoc, target, UNIFORM_VEC3); |
176 | |
177 | // Send to shader light color values |
178 | float color[4] = { (float)light.color.r/(float)255, (float)light.color.g/(float)255, |
179 | (float)light.color.b/(float)255, (float)light.color.a/(float)255 }; |
180 | SetShaderValue(shader, light.colorLoc, color, UNIFORM_VEC4); |
181 | } |
182 | |
183 | #endif // RLIGHTS_IMPLEMENTATION |