summaryrefslogtreecommitdiffhomepage
path: root/examples/models/rlights.h
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2017-07-19 18:55:26 +0200
committerraysan5 <[email protected]>2017-07-19 18:55:32 +0200
commit76c6f0b1e695b4090fd1e98d7f2d7ff7dea25641 (patch)
treef5055ea7986f6440fdeec3cab0c192eb361d584b /examples/models/rlights.h
parente8b65422c45cab6505a2ec717e46010144496c5c (diff)
downloadraylib-76c6f0b1e695b4090fd1e98d7f2d7ff7dea25641.tar.gz
raylib-76c6f0b1e695b4090fd1e98d7f2d7ff7dea25641.zip
Working on PBR system
Moved PBR material loading to example, right decision?
Diffstat (limited to 'examples/models/rlights.h')
-rw-r--r--examples/models/rlights.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/examples/models/rlights.h b/examples/models/rlights.h
new file mode 100644
index 00000000..0da3e2cb
--- /dev/null
+++ b/examples/models/rlights.h
@@ -0,0 +1,177 @@
+/**********************************************************************************************
+*
+* raylib.lights - Some useful functions to deal with lights data
+*
+* CONFIGURATION:
+*
+* #define RLIGHTS_IMPLEMENTATION
+* Generates the implementation of the library into the included file.
+* If not defined, the library is in header only mode and can be included in other headers
+* or source files without problems. But only ONE file should hold the implementation.
+*
+* LICENSE: zlib/libpng
+*
+* Copyright (c) 2017 Victor Fisac and Ramon Santamaria
+*
+* This software is provided "as-is", without any express or implied warranty. In no event
+* will the authors be held liable for any damages arising from the use of this software.
+*
+* Permission is granted to anyone to use this software for any purpose, including commercial
+* applications, and to alter it and redistribute it freely, subject to the following restrictions:
+*
+* 1. The origin of this software must not be misrepresented; you must not claim that you
+* wrote the original software. If you use this software in a product, an acknowledgment
+* in the product documentation would be appreciated but is not required.
+*
+* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
+* as being the original software.
+*
+* 3. This notice may not be removed or altered from any source distribution.
+*
+**********************************************************************************************/
+
+#ifndef RLIGHTS_H
+#define RLIGHTS_H
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+#define MAX_LIGHTS 4 // Max lights supported by shader
+#define LIGHT_DISTANCE 3.5f // Light distance from world center
+#define LIGHT_HEIGHT 1.0f // Light height position
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+typedef enum {
+ LIGHT_DIRECTIONAL,
+ LIGHT_POINT
+} LightType;
+
+typedef struct {
+ bool enabled;
+ LightType type;
+ Vector3 position;
+ Vector3 target;
+ Color color;
+ int enabledLoc;
+ int typeLoc;
+ int posLoc;
+ int targetLoc;
+ int colorLoc;
+} Light;
+
+#ifdef __cplusplus
+extern "C" { // Prevents name mangling of functions
+#endif
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+int lightsCount = 0; // Current amount of created lights
+
+//----------------------------------------------------------------------------------
+// Module Functions Declaration
+//----------------------------------------------------------------------------------
+Light CreateLight(int type, Vector3 pos, Vector3 targ, Color color, Shader shader); // Defines a light and get locations from PBR shader
+void UpdateLightValues(Shader shader, Light light); // Send to PBR shader light values
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // RLIGHTS_H
+
+
+/***********************************************************************************
+*
+* RLIGHTS IMPLEMENTATION
+*
+************************************************************************************/
+
+#if defined(RLIGHTS_IMPLEMENTATION)
+
+#include "raylib.h"
+
+//----------------------------------------------------------------------------------
+// Defines and Macros
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Types and Structures Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Global Variables Definition
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Module specific Functions Declaration
+//----------------------------------------------------------------------------------
+// ...
+
+//----------------------------------------------------------------------------------
+// Module Functions Definition
+//----------------------------------------------------------------------------------
+
+// Defines a light and get locations from PBR shader
+Light CreateLight(int type, Vector3 pos, Vector3 targ, Color color, Shader shader)
+{
+ Light light = { 0 };
+
+ if (lightsCount < MAX_LIGHTS)
+ {
+ light.enabled = true;
+ light.type = type;
+ light.position = pos;
+ light.target = targ;
+ light.color = color;
+
+ char enabledName[32] = "lights[x].enabled\0";
+ char typeName[32] = "lights[x].type\0";
+ char posName[32] = "lights[x].position\0";
+ char targetName[32] = "lights[x].target\0";
+ char colorName[32] = "lights[x].color\0";
+ enabledName[7] = '0' + lightsCount;
+ typeName[7] = '0' + lightsCount;
+ posName[7] = '0' + lightsCount;
+ targetName[7] = '0' + lightsCount;
+ colorName[7] = '0' + lightsCount;
+
+ light.enabledLoc = GetShaderLocation(shader, enabledName);
+ light.typeLoc = GetShaderLocation(shader, typeName);
+ light.posLoc = GetShaderLocation(shader, posName);
+ light.targetLoc = GetShaderLocation(shader, targetName);
+ light.colorLoc = GetShaderLocation(shader, colorName);
+
+ UpdateLightValues(shader, light);
+ lightsCount++;
+ }
+
+ return light;
+}
+
+// Send to PBR shader light values
+void UpdateLightValues(Shader shader, Light light)
+{
+ // Send to shader light enabled state and type
+ SetShaderValuei(shader, light.enabledLoc, (int[1]){ light.enabled }, 1);
+ SetShaderValuei(shader, light.typeLoc, (int[1]){ light.type }, 1);
+
+ // Send to shader light position values
+ float position[3] = { light.position.x, light.position.y, light.position.z };
+ SetShaderValue(shader, light.posLoc, position, 3);
+
+ // Send to shader light target position values
+ float target[3] = { light.target.x, light.target.y, light.target.z };
+ SetShaderValue(shader, light.targetLoc, target, 3);
+
+ // Send to shader light color values
+ float diff[4] = { (float)light.color.r/(float)255, (float)light.color.g/(float)255, (float)light.color.b/(float)255, (float)light.color.a/(float)255 };
+ SetShaderValue(shader, light.colorLoc, diff, 4);
+}
+
+#endif // RLIGHTS_IMPLEMENTATION \ No newline at end of file