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
46typedef 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
62typedef enum {
63 LIGHT_DIRECTIONAL,
64 LIGHT_POINT
65} LightType;
66
67#ifdef __cplusplus
68extern "C" { // Prevents name mangling of functions
69#endif
70
71//----------------------------------------------------------------------------------
72// Module Functions Declaration
73//----------------------------------------------------------------------------------
74Light CreateLight(int type, Vector3 position, Vector3 target, Color color, Shader shader); // Create a light and get shader locations
75void 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//----------------------------------------------------------------------------------
107static 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
119Light 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
163void 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