Merge branch 'master' into window-visibility
This commit is contained in:
commit
56173d7cf4
115 changed files with 23354 additions and 19806 deletions
24
.travis.yml
24
.travis.yml
|
|
@ -17,7 +17,7 @@ matrix:
|
||||||
env: ARCH=amd64 INSTALL_GLFW=YES USE_EXTERNAL_GLFW=OFF
|
env: ARCH=amd64 INSTALL_GLFW=YES USE_EXTERNAL_GLFW=OFF
|
||||||
sudo: required
|
sudo: required
|
||||||
- os: linux
|
- os: linux
|
||||||
env: ARCH=amd64 INSTALL_GLFW=YES OPENAL=ON STATIC=OFF RELEASE=NO
|
env: ARCH=amd64 INSTALL_GLFW=YES STATIC=OFF RELEASE=NO
|
||||||
sudo: required
|
sudo: required
|
||||||
- os: linux
|
- os: linux
|
||||||
env: WAYLAND=ON ARCH=amd64 RELEASE=NO
|
env: WAYLAND=ON ARCH=amd64 RELEASE=NO
|
||||||
|
|
@ -42,6 +42,9 @@ matrix:
|
||||||
- os: linux
|
- os: linux
|
||||||
env: ARCH=html5 RELEASE=NO
|
env: ARCH=html5 RELEASE=NO
|
||||||
sudo: required
|
sudo: required
|
||||||
|
- os: windows
|
||||||
|
compiler: gcc
|
||||||
|
env: ARCH=i386 SHARED=OFF RELEASE=NO
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
|
|
||||||
|
|
@ -49,7 +52,6 @@ before_install:
|
||||||
- if [ -z "$USE_EXTERNAL_GLFW" ]; then export USE_EXTERNAL_GLFW=IF_POSSIBLE; fi
|
- if [ -z "$USE_EXTERNAL_GLFW" ]; then export USE_EXTERNAL_GLFW=IF_POSSIBLE; fi
|
||||||
- if [ -z "$SHARED" ]; then export SHARED=ON ; fi
|
- if [ -z "$SHARED" ]; then export SHARED=ON ; fi
|
||||||
- if [ -z "$STATIC" ]; then export STATIC=ON ; fi
|
- if [ -z "$STATIC" ]; then export STATIC=ON ; fi
|
||||||
- if [ -z "$OPENAL" ]; then export OPENAL=OFF; fi
|
|
||||||
- if [[ "$INSTALL_GLFW" == "YES" && "$USE_EXTERNAL_GLFW" != "OFF" ]]; then
|
- if [[ "$INSTALL_GLFW" == "YES" && "$USE_EXTERNAL_GLFW" != "OFF" ]]; then
|
||||||
export DONT_TEST=1;
|
export DONT_TEST=1;
|
||||||
fi
|
fi
|
||||||
|
|
@ -101,6 +103,11 @@ before_install:
|
||||||
export RAYLIB_PACKAGE_SUFFIX="-macOS";
|
export RAYLIB_PACKAGE_SUFFIX="-macOS";
|
||||||
if [ "$INSTALL_GLFW" == "YES" ]; then brew update; brew install glfw; fi;
|
if [ "$INSTALL_GLFW" == "YES" ]; then brew update; brew install glfw; fi;
|
||||||
fi
|
fi
|
||||||
|
- if [ "$TRAVIS_OS_NAME" == "windows" ]; then
|
||||||
|
export DONT_TEST=1;
|
||||||
|
export RAYLIB_PACKAGE_SUFFIX="-windows";
|
||||||
|
export CMAKE_ARCH_ARGS='-DPLATFORM=Desktop';
|
||||||
|
fi
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- $RUNNER $CC --version
|
- $RUNNER $CC --version
|
||||||
|
|
||||||
|
|
@ -111,7 +118,7 @@ script:
|
||||||
sudo dpkg -i extra-cmake-modules_5.38.0a-0ubuntu1_amd64.deb;
|
sudo dpkg -i extra-cmake-modules_5.38.0a-0ubuntu1_amd64.deb;
|
||||||
git clone git://anongit.freedesktop.org/wayland/wayland-protocols;
|
git clone git://anongit.freedesktop.org/wayland/wayland-protocols;
|
||||||
pushd wayland-protocols;
|
pushd wayland-protocols;
|
||||||
git checkout 1.12 && ./autogen.sh --prefix=/usr && make && sudo make install;
|
git checkout 1.15 && ./autogen.sh --prefix=/usr && make && sudo make install;
|
||||||
popd;
|
popd;
|
||||||
fi
|
fi
|
||||||
- $RUNNER cmake $CMAKE_ARCH_ARGS
|
- $RUNNER cmake $CMAKE_ARCH_ARGS
|
||||||
|
|
@ -121,10 +128,15 @@ script:
|
||||||
-DUSE_EXTERNAL_GLFW=$USE_EXTERNAL_GLFW
|
-DUSE_EXTERNAL_GLFW=$USE_EXTERNAL_GLFW
|
||||||
-DUSE_WAYLAND=$WAYLAND
|
-DUSE_WAYLAND=$WAYLAND
|
||||||
-DINCLUDE_EVERYTHING=ON
|
-DINCLUDE_EVERYTHING=ON
|
||||||
|
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
|
||||||
..
|
..
|
||||||
- $RUNNER make VERBOSE=1
|
- $RUNNER cmake --build . --target
|
||||||
- if [ "$RELEASE" != "NO" ]; then $RUNNER make package; fi
|
- if [ "$RELEASE" != "NO" ]; then $RUNNER cmake --build . --target package; fi
|
||||||
- sudo $RUNNER make install
|
- if [ -n "$RUNNER" ]; then
|
||||||
|
sudo $RUNNER cmake --build . --target install;
|
||||||
|
else
|
||||||
|
$(which sudo) $RUNNER "$(which cmake)" --build . --target install;
|
||||||
|
fi
|
||||||
- if [ ! "$DONT_TEST" ]; then
|
- if [ ! "$DONT_TEST" ]; then
|
||||||
pkg-config --static --libs raylib;
|
pkg-config --static --libs raylib;
|
||||||
nm -g release/libraylib.a | grep glfwGetProcAddress || (echo "libraylib.a doesn't contain GLFW symbols! Aborting..." && false);
|
nm -g release/libraylib.a | grep glfwGetProcAddress || (echo "libraylib.a doesn't contain GLFW symbols! Aborting..." && false);
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ Some people ported raylib to other languages in form of bindings or wrappers to
|
||||||
|
|
||||||
- [raylib](https://github.com/raysan5/raylib) : raylib **C/C++** version (default)
|
- [raylib](https://github.com/raysan5/raylib) : raylib **C/C++** version (default)
|
||||||
- [raylib-lua](https://github.com/raysan5/raylib-lua) : raylib **Lua** binding
|
- [raylib-lua](https://github.com/raysan5/raylib-lua) : raylib **Lua** binding
|
||||||
|
- [raylib-lua-ffi](https://github.com/raysan5/raylib/issues/693) : raylib **Lua** ffi binding
|
||||||
- [raylib-go](https://github.com/gen2brain/raylib-go) : raylib **Go** binding
|
- [raylib-go](https://github.com/gen2brain/raylib-go) : raylib **Go** binding
|
||||||
- [raylib-Nim](https://gitlab.com/define-private-public/raylib-Nim) : raylib **Nim** binding
|
- [raylib-Nim](https://gitlab.com/define-private-public/raylib-Nim) : raylib **Nim** binding
|
||||||
- [cray](https://gitlab.com/Zatherz/cray) - raylib **Crystal** binding
|
- [cray](https://gitlab.com/Zatherz/cray) - raylib **Crystal** binding
|
||||||
|
|
@ -74,7 +75,9 @@ Some people ported raylib to other languages in form of bindings or wrappers to
|
||||||
- [raylib-py](https://github.com/overdev/raylib-py) : raylib **Python** binding
|
- [raylib-py](https://github.com/overdev/raylib-py) : raylib **Python** binding
|
||||||
- [raylib-haskell](https://github.com/DevJac/raylib-haskell) : raylib **Haskell** binding
|
- [raylib-haskell](https://github.com/DevJac/raylib-haskell) : raylib **Haskell** binding
|
||||||
- [raylib-java](https://github.com/XoanaIO/raylib-java) : raylib **Java** binding
|
- [raylib-java](https://github.com/XoanaIO/raylib-java) : raylib **Java** binding
|
||||||
- *[raylib flat-assembler Usage example](http://forum.raylib.com/index.php?p=/discussion/comment/425/#Comment_425)*
|
- [raylib-chaiscript](https://github.com/RobLoach/raylib-chaiscript) : raylib **ChaiScript** binding
|
||||||
|
- [node-raylib](https://github.com/RobLoach/node-raylib) : **Node.js** raylib binding
|
||||||
|
- *[raylib flat-assembler Usage example]()*
|
||||||
- *[raylib COBOL Usage example](https://github.com/Martinfx/Cobol/tree/master/OpenCobol/Games/raylib)*
|
- *[raylib COBOL Usage example](https://github.com/Martinfx/Cobol/tree/master/OpenCobol/Games/raylib)*
|
||||||
|
|
||||||
Usually, raylib bindings follow the convention: `raylib-{language}`
|
Usually, raylib bindings follow the convention: `raylib-{language}`
|
||||||
|
|
|
||||||
|
|
@ -149,7 +149,7 @@ On November 2016, only 4 months after raylib 1.5, arrives raylib 1.6. This new v
|
||||||
|
|
||||||
Complete [raylib Lua binding](https://github.com/raysan5/raylib-lua). All raylib functions plus the +60 code examples have been ported to Lua, now Lua users can enjoy coding videogames in Lua while using all the internal power of raylib. This addition also open the doors to Lua scripting support for a future raylib-based engine, being able to move game logic (Init, Update, Draw, De-Init) to Lua scripts while keep using raylib functionality.
|
Complete [raylib Lua binding](https://github.com/raysan5/raylib-lua). All raylib functions plus the +60 code examples have been ported to Lua, now Lua users can enjoy coding videogames in Lua while using all the internal power of raylib. This addition also open the doors to Lua scripting support for a future raylib-based engine, being able to move game logic (Init, Update, Draw, De-Init) to Lua scripts while keep using raylib functionality.
|
||||||
|
|
||||||
Completely redesigned [audio module](https://github.com/raysan5/raylib/blob/master/src/audio.c). Based on the new direction taken in raylib 1.5, it has been further improved and more functionality added (+20 new functions) to allow raw audio processing and streaming. [FLAC file format support](https://github.com/raysan5/raylib/blob/master/src/external/dr_flac.h) has also been added. In the same line, [OpenAL Soft](https://github.com/kcat/openal-soft) backend is now provided as a static library in Windows to allow static linking and get ride of OpenAL32.dll. Now raylib Windows games are completey self-contained, no external libraries required any more!
|
Completely redesigned [audio module](https://github.com/raysan5/raylib/blob/master/src/raudio.c). Based on the new direction taken in raylib 1.5, it has been further improved and more functionality added (+20 new functions) to allow raw audio processing and streaming. [FLAC file format support](https://github.com/raysan5/raylib/blob/master/src/external/dr_flac.h) has also been added. In the same line, [OpenAL Soft](https://github.com/kcat/openal-soft) backend is now provided as a static library in Windows to allow static linking and get ride of OpenAL32.dll. Now raylib Windows games are completey self-contained, no external libraries required any more!
|
||||||
|
|
||||||
[Physac](https://github.com/victorfisac/Physac) module has been moved to its own repository and it has been improved A LOT, actually, library has been completely rewritten from scratch by [@victorfisac](https://github.com/victorfisac), multiple samples have been added together with countless new features to match current standard 2D physic libraries. Results are amazing!
|
[Physac](https://github.com/victorfisac/Physac) module has been moved to its own repository and it has been improved A LOT, actually, library has been completely rewritten from scratch by [@victorfisac](https://github.com/victorfisac), multiple samples have been added together with countless new features to match current standard 2D physic libraries. Results are amazing!
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ NOTE for ADVENTURERS: raylib is a programming library to enjoy videogames progra
|
||||||
no fancy interface, no visual helpers, no auto-debugging... just coding in the most
|
no fancy interface, no visual helpers, no auto-debugging... just coding in the most
|
||||||
pure spartan-programmers way. Are you ready to learn? Jump to [code examples!](http://www.raylib.com/examples.html)
|
pure spartan-programmers way. Are you ready to learn? Jump to [code examples!](http://www.raylib.com/examples.html)
|
||||||
|
|
||||||
[](https://travis-ci.org/raysan5/raylib)
|
[](https://travis-ci.org/raysan5/raylib)
|
||||||
[](https://ci.appveyor.com/project/raysan5/raylib)
|
[](https://ci.appveyor.com/project/raysan5/raylib)
|
||||||
[](https://discord.gg/VkzNHUE)
|
[](https://discord.gg/VkzNHUE)
|
||||||
[](LICENSE.md)
|
[](LICENSE.md)
|
||||||
|
|
@ -35,7 +35,7 @@ features
|
||||||
|
|
||||||
raylib uses on its [core](https://github.com/raysan5/raylib/blob/master/src/core.c) module the outstanding [GLFW3](http://www.glfw.org/) library, embedded inside raylib in the form of [rglfw](https://github.com/raysan5/raylib/blob/master/src/rglfw.c) module, avoiding that way external dependencies.
|
raylib uses on its [core](https://github.com/raysan5/raylib/blob/master/src/core.c) module the outstanding [GLFW3](http://www.glfw.org/) library, embedded inside raylib in the form of [rglfw](https://github.com/raysan5/raylib/blob/master/src/rglfw.c) module, avoiding that way external dependencies.
|
||||||
|
|
||||||
raylib uses on its [audio](https://github.com/raysan5/raylib/blob/master/src/audio.c) module, the amazing [mini_al](https://github.com/dr-soft/mini_al) audio library, single-file header-only and supporting multiple platforms and multiple audio backends.
|
raylib uses on its [audio](https://github.com/raysan5/raylib/blob/master/src/raudio.c) module, the amazing [mini_al](https://github.com/dr-soft/mini_al) audio library, single-file header-only and supporting multiple platforms and multiple audio backends.
|
||||||
|
|
||||||
raylib uses internally multiple single-file header-only libraries to support multiple fileformats loading and saving, all those libraries are embedded with raylib and available in [src/external](https://github.com/raysan5/raylib/tree/master/src/external) directory.
|
raylib uses internally multiple single-file header-only libraries to support multiple fileformats loading and saving, all those libraries are embedded with raylib and available in [src/external](https://github.com/raysan5/raylib/tree/master/src/external) directory.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ if(${PLATFORM} MATCHES "Android")
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_model_shader.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_model_shader.c)
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_postprocessing.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_postprocessing.c)
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_raymarching.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_raymarching.c)
|
||||||
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_palette_switch.c)
|
||||||
|
|
||||||
elseif(${PLATFORM} MATCHES "Web")
|
elseif(${PLATFORM} MATCHES "Web")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1")
|
||||||
|
|
|
||||||
|
|
@ -118,8 +118,8 @@ endif
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
# Emscripten required variables
|
# Emscripten required variables
|
||||||
EMSDK_PATH = C:/emsdk
|
EMSDK_PATH = C:/emsdk
|
||||||
EMSCRIPTEN_VERSION = 1.38.20
|
EMSCRIPTEN_VERSION = 1.38.21
|
||||||
CLANG_VERSION = e1.38.20_64bit
|
CLANG_VERSION = e1.38.21_64bit
|
||||||
PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64
|
PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64
|
||||||
NODE_VERSION = 8.9.1_64bit
|
NODE_VERSION = 8.9.1_64bit
|
||||||
export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH)
|
export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH)
|
||||||
|
|
@ -130,23 +130,23 @@ endif
|
||||||
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version.
|
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version.
|
||||||
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
ifeq ($(PLATFORM_OS),WINDOWS)
|
ifeq ($(PLATFORM_OS),WINDOWS)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/win32/mingw32
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM_OS),LINUX)
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/linux
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM_OS),OSX)
|
ifeq ($(PLATFORM_OS),OSX)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/osx
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/bsd
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM),PLATFORM_RPI)
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/rpi
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM),PLATFORM_WEB)
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/release/libs/html5
|
RAYLIB_RELEASE_PATH = $(RAYLIB_PATH)/src
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
|
# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
|
||||||
|
|
@ -249,7 +249,7 @@ ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
# -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
|
# -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
|
||||||
# --profiling # include information for code profiling
|
# --profiling # include information for code profiling
|
||||||
# --preload-file resources # specify a resources folder for data compilation
|
# --preload-file resources # specify a resources folder for data compilation
|
||||||
CFLAGS += -Os -s USE_GLFW=3 -s USE_SDL=2 -s ASSERTIONS=1 -s WASM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1
|
CFLAGS += -Os -s USE_GLFW=3 -s ASSERTIONS=1 -s WASM=1 -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1
|
||||||
|
|
||||||
# NOTE: Simple raylib examples are compiled to be interpreter by emterpreter, that way,
|
# NOTE: Simple raylib examples are compiled to be interpreter by emterpreter, that way,
|
||||||
# we can compile same code for ALL platforms with no change required, but, working on bigger
|
# we can compile same code for ALL platforms with no change required, but, working on bigger
|
||||||
|
|
@ -407,7 +407,7 @@ EXAMPLES = \
|
||||||
models/models_box_collisions \
|
models/models_box_collisions \
|
||||||
models/models_billboard \
|
models/models_billboard \
|
||||||
models/models_obj_loading \
|
models/models_obj_loading \
|
||||||
models/models_obj_viewing \
|
models/models_obj_viewer \
|
||||||
models/models_heightmap \
|
models/models_heightmap \
|
||||||
models/models_cubicmap \
|
models/models_cubicmap \
|
||||||
models/models_mesh_picking \
|
models/models_mesh_picking \
|
||||||
|
|
@ -420,6 +420,7 @@ EXAMPLES = \
|
||||||
shaders/shaders_custom_uniform \
|
shaders/shaders_custom_uniform \
|
||||||
shaders/shaders_postprocessing \
|
shaders/shaders_postprocessing \
|
||||||
shaders/shaders_raymarching \
|
shaders/shaders_raymarching \
|
||||||
|
shaders/shaders_palette_switch \
|
||||||
audio/audio_sound_loading \
|
audio/audio_sound_loading \
|
||||||
audio/audio_music_stream \
|
audio/audio_music_stream \
|
||||||
audio/audio_module_playing \
|
audio/audio_module_playing \
|
||||||
|
|
|
||||||
|
|
@ -30,11 +30,11 @@ int main()
|
||||||
int screenWidth = 800;
|
int screenWidth = 800;
|
||||||
int screenHeight = 450;
|
int screenHeight = 450;
|
||||||
|
|
||||||
SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X
|
SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
Color colors[14] = { ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK,
|
Color colors[14] = { ORANGE, RED, GOLD, LIME, BLUE, VIOLET, BROWN, LIGHTGRAY, PINK,
|
||||||
YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE };
|
YELLOW, GREEN, SKYBLUE, PURPLE, BEIGE };
|
||||||
|
|
@ -52,7 +52,7 @@ int main()
|
||||||
circles[i].color = colors[GetRandomValue(0, 13)];
|
circles[i].color = colors[GetRandomValue(0, 13)];
|
||||||
}
|
}
|
||||||
|
|
||||||
Music xm = LoadMusicStream("resources/mini1111.xm");
|
Music xm = LoadMusicStream("resources/chiptun1.mod");
|
||||||
|
|
||||||
PlayMusicStream(xm);
|
PlayMusicStream(xm);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ int main()
|
||||||
|
|
||||||
// Send to material PBR shader camera view position
|
// Send to material PBR shader camera view position
|
||||||
float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
|
float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
|
||||||
SetShaderValue(model.material.shader, model.material.shader.locs[LOC_VECTOR_VIEW], cameraPos, 3);
|
SetShaderValue(model.material.shader, model.material.shader.locs[LOC_VECTOR_VIEW], cameraPos, UNIFORM_VEC3);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
|
|
@ -148,15 +148,15 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness)
|
||||||
Shader shdrBRDF = LoadShader(PATH_BRDF_VS, PATH_BRDF_FS);
|
Shader shdrBRDF = LoadShader(PATH_BRDF_VS, PATH_BRDF_FS);
|
||||||
|
|
||||||
// Setup required shader locations
|
// Setup required shader locations
|
||||||
SetShaderValuei(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, 1);
|
SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, UNIFORM_INT);
|
||||||
SetShaderValuei(shdrIrradiance, GetShaderLocation(shdrIrradiance, "environmentMap"), (int[1]){ 0 }, 1);
|
SetShaderValue(shdrIrradiance, GetShaderLocation(shdrIrradiance, "environmentMap"), (int[1]){ 0 }, UNIFORM_INT);
|
||||||
SetShaderValuei(shdrPrefilter, GetShaderLocation(shdrPrefilter, "environmentMap"), (int[1]){ 0 }, 1);
|
SetShaderValue(shdrPrefilter, GetShaderLocation(shdrPrefilter, "environmentMap"), (int[1]){ 0 }, UNIFORM_INT);
|
||||||
|
|
||||||
Texture2D texHDR = LoadTexture("resources/dresden_square.hdr");
|
Texture2D texHDR = LoadTexture("resources/dresden_square.hdr");
|
||||||
Texture2D cubemap = GenTextureCubemap(shdrCubemap, texHDR, CUBEMAP_SIZE);
|
Texture2D cubemap = GenTextureCubemap(shdrCubemap, texHDR, CUBEMAP_SIZE);
|
||||||
mat.maps[MAP_IRRADIANCE].texture = GenTextureIrradiance(shdrIrradiance, cubemap, IRRADIANCE_SIZE);
|
mat.maps[MAP_IRRADIANCE].texture = GenTextureIrradiance(shdrIrradiance, cubemap, IRRADIANCE_SIZE);
|
||||||
mat.maps[MAP_PREFILTER].texture = GenTexturePrefilter(shdrPrefilter, cubemap, PREFILTERED_SIZE);
|
mat.maps[MAP_PREFILTER].texture = GenTexturePrefilter(shdrPrefilter, cubemap, PREFILTERED_SIZE);
|
||||||
mat.maps[MAP_BRDF].texture = GenTextureBRDF(shdrBRDF, cubemap, BRDF_SIZE);
|
mat.maps[MAP_BRDF].texture = GenTextureBRDF(shdrBRDF, BRDF_SIZE);
|
||||||
UnloadTexture(cubemap);
|
UnloadTexture(cubemap);
|
||||||
UnloadTexture(texHDR);
|
UnloadTexture(texHDR);
|
||||||
|
|
||||||
|
|
@ -174,14 +174,14 @@ static Material LoadMaterialPBR(Color albedo, float metalness, float roughness)
|
||||||
SetTextureFilter(mat.maps[MAP_OCCLUSION].texture, FILTER_BILINEAR);
|
SetTextureFilter(mat.maps[MAP_OCCLUSION].texture, FILTER_BILINEAR);
|
||||||
|
|
||||||
// Enable sample usage in shader for assigned textures
|
// Enable sample usage in shader for assigned textures
|
||||||
SetShaderValuei(mat.shader, GetShaderLocation(mat.shader, "albedo.useSampler"), (int[1]){ 1 }, 1);
|
SetShaderValue(mat.shader, GetShaderLocation(mat.shader, "albedo.useSampler"), (int[1]){ 1 }, UNIFORM_INT);
|
||||||
SetShaderValuei(mat.shader, GetShaderLocation(mat.shader, "normals.useSampler"), (int[1]){ 1 }, 1);
|
SetShaderValue(mat.shader, GetShaderLocation(mat.shader, "normals.useSampler"), (int[1]){ 1 }, UNIFORM_INT);
|
||||||
SetShaderValuei(mat.shader, GetShaderLocation(mat.shader, "metalness.useSampler"), (int[1]){ 1 }, 1);
|
SetShaderValue(mat.shader, GetShaderLocation(mat.shader, "metalness.useSampler"), (int[1]){ 1 }, UNIFORM_INT);
|
||||||
SetShaderValuei(mat.shader, GetShaderLocation(mat.shader, "roughness.useSampler"), (int[1]){ 1 }, 1);
|
SetShaderValue(mat.shader, GetShaderLocation(mat.shader, "roughness.useSampler"), (int[1]){ 1 }, UNIFORM_INT);
|
||||||
SetShaderValuei(mat.shader, GetShaderLocation(mat.shader, "occlusion.useSampler"), (int[1]){ 1 }, 1);
|
SetShaderValue(mat.shader, GetShaderLocation(mat.shader, "occlusion.useSampler"), (int[1]){ 1 }, UNIFORM_INT);
|
||||||
|
|
||||||
int renderModeLoc = GetShaderLocation(mat.shader, "renderMode");
|
int renderModeLoc = GetShaderLocation(mat.shader, "renderMode");
|
||||||
SetShaderValuei(mat.shader, renderModeLoc, (int[1]){ 0 }, 1);
|
SetShaderValue(mat.shader, renderModeLoc, (int[1]){ 0 }, UNIFORM_INT);
|
||||||
|
|
||||||
// Set up material properties color
|
// Set up material properties color
|
||||||
mat.maps[MAP_ALBEDO].color = albedo;
|
mat.maps[MAP_ALBEDO].color = albedo;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ int main()
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [models] example - skybox loading and drawing");
|
InitWindow(screenWidth, screenHeight, "raylib [models] example - skybox loading and drawing");
|
||||||
|
|
||||||
// Define the camera to look into our 3d world
|
// Define the camera to look into our 3d world
|
||||||
Camera camera = {{ 1.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 };
|
Camera camera = {{ 1.0f, 1.0f, 1.0f }, { 4.0f, 1.0f, 4.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f, 0 };
|
||||||
|
|
||||||
// Load skybox model
|
// Load skybox model
|
||||||
Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
|
Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
|
||||||
|
|
@ -30,11 +30,11 @@ int main()
|
||||||
// Load skybox shader and set required locations
|
// Load skybox shader and set required locations
|
||||||
// NOTE: Some locations are automatically set at shader loading
|
// NOTE: Some locations are automatically set at shader loading
|
||||||
skybox.material.shader = LoadShader("resources/shaders/skybox.vs", "resources/shaders/skybox.fs");
|
skybox.material.shader = LoadShader("resources/shaders/skybox.vs", "resources/shaders/skybox.fs");
|
||||||
SetShaderValuei(skybox.material.shader, GetShaderLocation(skybox.material.shader, "environmentMap"), (int[1]){ MAP_CUBEMAP }, 1);
|
SetShaderValue(skybox.material.shader, GetShaderLocation(skybox.material.shader, "environmentMap"), (int[1]){ MAP_CUBEMAP }, UNIFORM_INT);
|
||||||
|
|
||||||
// Load cubemap shader and setup required shader locations
|
// Load cubemap shader and setup required shader locations
|
||||||
Shader shdrCubemap = LoadShader("resources/shaders/cubemap.vs", "resources/shaders/cubemap.fs");
|
Shader shdrCubemap = LoadShader("resources/shaders/cubemap.vs", "resources/shaders/cubemap.fs");
|
||||||
SetShaderValuei(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, 1);
|
SetShaderValue(shdrCubemap, GetShaderLocation(shdrCubemap, "equirectangularMap"), (int[1]){ 0 }, UNIFORM_INT);
|
||||||
|
|
||||||
// Load HDR panorama (sphere) texture
|
// Load HDR panorama (sphere) texture
|
||||||
Texture2D texHDR = LoadTexture("resources/dresden_square.hdr");
|
Texture2D texHDR = LoadTexture("resources/dresden_square.hdr");
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,15 @@
|
||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* rPBR [shader] - Bidirectional reflectance distribution function fragment shader
|
* BRDF LUT Generation - Bidirectional reflectance distribution function fragment shader
|
||||||
|
*
|
||||||
|
* REF: https://github.com/HectorMF/BRDFGenerator
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 Victor Fisac
|
* Copyright (c) 2017 Victor Fisac
|
||||||
*
|
*
|
||||||
**********************************************************************************************/
|
**********************************************************************************************/
|
||||||
|
|
||||||
#version 330
|
#version 330
|
||||||
|
|
||||||
#define MAX_SAMPLES 1024u
|
#define MAX_SAMPLES 1024u
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
// Input vertex attributes (from vertex shader)
|
||||||
|
|
@ -18,43 +21,30 @@ const float PI = 3.14159265359;
|
||||||
// Output fragment color
|
// Output fragment color
|
||||||
out vec4 finalColor;
|
out vec4 finalColor;
|
||||||
|
|
||||||
float DistributionGGX(vec3 N, vec3 H, float roughness);
|
|
||||||
float RadicalInverse_VdC(uint bits);
|
|
||||||
vec2 Hammersley(uint i, uint N);
|
vec2 Hammersley(uint i, uint N);
|
||||||
vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness);
|
float RadicalInverseVdC(uint bits);
|
||||||
float GeometrySchlickGGX(float NdotV, float roughness);
|
float GeometrySchlickGGX(float NdotV, float roughness);
|
||||||
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness);
|
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness);
|
||||||
|
vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness);
|
||||||
vec2 IntegrateBRDF(float NdotV, float roughness);
|
vec2 IntegrateBRDF(float NdotV, float roughness);
|
||||||
|
|
||||||
float DistributionGGX(vec3 N, vec3 H, float roughness)
|
float RadicalInverseVdC(uint bits)
|
||||||
{
|
{
|
||||||
float a = roughness*roughness;
|
bits = (bits << 16u) | (bits >> 16u);
|
||||||
float a2 = a*a;
|
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
|
||||||
float NdotH = max(dot(N, H), 0.0);
|
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
|
||||||
float NdotH2 = NdotH*NdotH;
|
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
|
||||||
|
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
||||||
float nom = a2;
|
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
|
||||||
float denom = (NdotH2*(a2 - 1.0) + 1.0);
|
|
||||||
denom = PI*denom*denom;
|
|
||||||
|
|
||||||
return nom/denom;
|
|
||||||
}
|
|
||||||
|
|
||||||
float RadicalInverse_VdC(uint bits)
|
|
||||||
{
|
|
||||||
bits = (bits << 16u) | (bits >> 16u);
|
|
||||||
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
|
|
||||||
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
|
|
||||||
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
|
|
||||||
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
|
||||||
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute Hammersley coordinates
|
||||||
vec2 Hammersley(uint i, uint N)
|
vec2 Hammersley(uint i, uint N)
|
||||||
{
|
{
|
||||||
return vec2(float(i)/float(N), RadicalInverse_VdC(i));
|
return vec2(float(i)/float(N), RadicalInverseVdC(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Integrate number of importance samples for (roughness and NoV)
|
||||||
vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness)
|
vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness)
|
||||||
{
|
{
|
||||||
float a = roughness*roughness;
|
float a = roughness*roughness;
|
||||||
|
|
@ -85,6 +75,7 @@ float GeometrySchlickGGX(float NdotV, float roughness)
|
||||||
return nom/denom;
|
return nom/denom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute the geometry term for the BRDF given roughness squared, NoV, NoL
|
||||||
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
{
|
{
|
||||||
float NdotV = max(dot(N, V), 0.0);
|
float NdotV = max(dot(N, V), 0.0);
|
||||||
|
|
@ -97,29 +88,31 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
|
|
||||||
vec2 IntegrateBRDF(float NdotV, float roughness)
|
vec2 IntegrateBRDF(float NdotV, float roughness)
|
||||||
{
|
{
|
||||||
vec3 V = vec3(sqrt(1.0 - NdotV*NdotV), 0.0, NdotV);
|
|
||||||
float A = 0.0;
|
float A = 0.0;
|
||||||
float B = 0.0;
|
float B = 0.0;
|
||||||
|
vec3 V = vec3(sqrt(1.0 - NdotV*NdotV), 0.0, NdotV);
|
||||||
vec3 N = vec3(0.0, 0.0, 1.0);
|
vec3 N = vec3(0.0, 0.0, 1.0);
|
||||||
|
|
||||||
for(uint i = 0u; i < MAX_SAMPLES; i++)
|
for (int i = 0; i < MAX_SAMPLES; i++)
|
||||||
{
|
{
|
||||||
// Generate a sample vector that's biased towards the preferred alignment direction (importance sampling)
|
// Generate a sample vector that's biased towards the preferred alignment direction (importance sampling)
|
||||||
vec2 Xi = Hammersley(i, MAX_SAMPLES);
|
|
||||||
vec3 H = ImportanceSampleGGX(Xi, N, roughness);
|
vec2 Xi = Hammersley(i, MAX_SAMPLES); // Compute a Hammersely coordinate
|
||||||
vec3 L = normalize(2.0*dot(V, H)*H - V);
|
vec3 H = ImportanceSampleGGX(Xi, N, roughness); // Integrate number of importance samples for (roughness and NoV)
|
||||||
float NdotL = max(L.z, 0.0);
|
vec3 L = normalize(2.0*dot(V, H)*H - V); // Compute reflection vector L
|
||||||
float NdotH = max(H.z, 0.0);
|
|
||||||
float VdotH = max(dot(V, H), 0.0);
|
float NdotL = max(L.z, 0.0); // Compute normal dot light
|
||||||
|
float NdotH = max(H.z, 0.0); // Compute normal dot half
|
||||||
|
float VdotH = max(dot(V, H), 0.0); // Compute view dot half
|
||||||
|
|
||||||
if (NdotL > 0.0)
|
if (NdotL > 0.0)
|
||||||
{
|
{
|
||||||
float G = GeometrySmith(N, V, L, roughness);
|
float G = GeometrySmith(N, V, L, roughness); // Compute the geometry term for the BRDF given roughness squared, NoV, NoL
|
||||||
float G_Vis = (G*VdotH)/(NdotH*NdotV);
|
float GVis = (G*VdotH)/(NdotH*NdotV); // Compute the visibility term given G, VoH, NoH, NoV, NoL
|
||||||
float Fc = pow(1.0 - VdotH, 5.0);
|
float Fc = pow(1.0 - VdotH, 5.0); // Compute the fresnel term given VoH
|
||||||
|
|
||||||
A += (1.0 - Fc)*G_Vis;
|
A += (1.0 - Fc)*GVis; // Sum the result given fresnel, geometry, visibility
|
||||||
B += Fc*G_Vis;
|
B += Fc*GVis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
#version 330
|
#version 330
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
// Input vertex attributes (from vertex shader)
|
||||||
in vec3 fragPos;
|
in vec3 fragPosition;
|
||||||
|
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
uniform sampler2D equirectangularMap;
|
uniform sampler2D equirectangularMap;
|
||||||
|
|
@ -28,7 +28,7 @@ vec2 SampleSphericalMap(vec3 v)
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Normalize local position
|
// Normalize local position
|
||||||
vec2 uv = SampleSphericalMap(normalize(fragPos));
|
vec2 uv = SampleSphericalMap(normalize(fragPosition));
|
||||||
|
|
||||||
// Fetch color from texture map
|
// Fetch color from texture map
|
||||||
vec3 color = texture(equirectangularMap, uv).rgb;
|
vec3 color = texture(equirectangularMap, uv).rgb;
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,12 @@ uniform mat4 projection;
|
||||||
uniform mat4 view;
|
uniform mat4 view;
|
||||||
|
|
||||||
// Output vertex attributes (to fragment shader)
|
// Output vertex attributes (to fragment shader)
|
||||||
out vec3 fragPos;
|
out vec3 fragPosition;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Calculate fragment position based on model transformations
|
// Calculate fragment position based on model transformations
|
||||||
fragPos = vertexPosition;
|
fragPosition = vertexPosition;
|
||||||
|
|
||||||
// Calculate final vertex position
|
// Calculate final vertex position
|
||||||
gl_Position = projection*view*vec4(vertexPosition, 1.0);
|
gl_Position = projection*view*vec4(vertexPosition, 1.0);
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
#version 330
|
#version 330
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
// Input vertex attributes (from vertex shader)
|
||||||
in vec3 fragPos;
|
in vec3 fragPosition;
|
||||||
|
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
uniform samplerCube environmentMap;
|
uniform samplerCube environmentMap;
|
||||||
|
|
@ -20,7 +20,7 @@ out vec4 finalColor;
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Fetch color from texture map
|
// Fetch color from texture map
|
||||||
vec3 color = texture(environmentMap, fragPos).rgb;
|
vec3 color = texture(environmentMap, fragPosition).rgb;
|
||||||
|
|
||||||
// Apply gamma correction
|
// Apply gamma correction
|
||||||
color = color/(color + vec3(1.0));
|
color = color/(color + vec3(1.0));
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,12 @@ uniform mat4 projection;
|
||||||
uniform mat4 view;
|
uniform mat4 view;
|
||||||
|
|
||||||
// Output vertex attributes (to fragment shader)
|
// Output vertex attributes (to fragment shader)
|
||||||
out vec3 fragPos;
|
out vec3 fragPosition;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Calculate fragment position based on model transformations
|
// Calculate fragment position based on model transformations
|
||||||
fragPos = vertexPosition;
|
fragPosition = vertexPosition;
|
||||||
|
|
||||||
// Remove translation from the view matrix
|
// Remove translation from the view matrix
|
||||||
mat4 rotView = mat4(mat3(view));
|
mat4 rotView = mat4(mat3(view));
|
||||||
|
|
|
||||||
|
|
@ -158,20 +158,20 @@ Light CreateLight(int type, Vector3 pos, Vector3 targ, Color color, Shader shade
|
||||||
void UpdateLightValues(Shader shader, Light light)
|
void UpdateLightValues(Shader shader, Light light)
|
||||||
{
|
{
|
||||||
// Send to shader light enabled state and type
|
// Send to shader light enabled state and type
|
||||||
SetShaderValuei(shader, light.enabledLoc, (int[1]){ light.enabled }, 1);
|
SetShaderValue(shader, light.enabledLoc, &light.enabled, UNIFORM_INT);
|
||||||
SetShaderValuei(shader, light.typeLoc, (int[1]){ light.type }, 1);
|
SetShaderValue(shader, light.typeLoc, &light.type, UNIFORM_INT);
|
||||||
|
|
||||||
// Send to shader light position values
|
// Send to shader light position values
|
||||||
float position[3] = { light.position.x, light.position.y, light.position.z };
|
float position[3] = { light.position.x, light.position.y, light.position.z };
|
||||||
SetShaderValue(shader, light.posLoc, position, 3);
|
SetShaderValue(shader, light.posLoc, position, UNIFORM_VEC3);
|
||||||
|
|
||||||
// Send to shader light target position values
|
// Send to shader light target position values
|
||||||
float target[3] = { light.target.x, light.target.y, light.target.z };
|
float target[3] = { light.target.x, light.target.y, light.target.z };
|
||||||
SetShaderValue(shader, light.targetLoc, target, 3);
|
SetShaderValue(shader, light.targetLoc, target, UNIFORM_VEC3);
|
||||||
|
|
||||||
// Send to shader light color values
|
// 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 };
|
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);
|
SetShaderValue(shader, light.colorLoc, diff, UNIFORM_VEC4);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // RLIGHTS_IMPLEMENTATION
|
#endif // RLIGHTS_IMPLEMENTATION
|
||||||
141
examples/others/raudio_standalone.c
Normal file
141
examples/others/raudio_standalone.c
Normal file
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [audio] example - Using raudio module as standalone module
|
||||||
|
*
|
||||||
|
* NOTE: This example does not require any graphic device, it can run directly on console.
|
||||||
|
*
|
||||||
|
* DEPENDENCIES:
|
||||||
|
* mini_al.h - Audio device management lib (http://kcat.strangesoft.net/openal.html)
|
||||||
|
* stb_vorbis.h - Ogg audio files loading (http://www.nothings.org/stb_vorbis/)
|
||||||
|
* jar_xm.h - XM module file loading
|
||||||
|
* jar_mod.h - MOD audio file loading
|
||||||
|
* dr_flac.h - FLAC audio file loading
|
||||||
|
*
|
||||||
|
* COMPILATION:
|
||||||
|
* gcc -c ..\..\src\external\mini_al.c -Wall -I.
|
||||||
|
* gcc -o audio_standalone.exe audio_standalone.c ..\..\src\raudio.c mini_al.o /
|
||||||
|
* -I..\..\src -I..\..\src\external -L. -Wall -std=c99 /
|
||||||
|
* -DAUDIO_STANDALONE -DSUPPORT_FILEFORMAT_WAV -DSUPPORT_FILEFORMAT_OGG
|
||||||
|
*
|
||||||
|
* LICENSE: zlib/libpng
|
||||||
|
*
|
||||||
|
* This example is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2019 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raudio.h" // raylib audio library
|
||||||
|
|
||||||
|
#include <stdio.h> // Required for: printf()
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
#include <conio.h> // Windows only, no stardard library
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Provide kbhit() function in non-Windows platforms
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
// Check if a key has been pressed
|
||||||
|
static int kbhit(void)
|
||||||
|
{
|
||||||
|
struct termios oldt, newt;
|
||||||
|
int ch;
|
||||||
|
int oldf;
|
||||||
|
|
||||||
|
tcgetattr(STDIN_FILENO, &oldt);
|
||||||
|
newt = oldt;
|
||||||
|
newt.c_lflag &= ~(ICANON | ECHO);
|
||||||
|
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
|
||||||
|
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
|
||||||
|
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
|
||||||
|
|
||||||
|
ch = getchar();
|
||||||
|
|
||||||
|
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
|
||||||
|
fcntl(STDIN_FILENO, F_SETFL, oldf);
|
||||||
|
|
||||||
|
if (ch != EOF)
|
||||||
|
{
|
||||||
|
ungetc(ch, stdin);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get pressed character
|
||||||
|
static char getch() { return getchar(); }
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define KEY_ESCAPE 27
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
static unsigned char key;
|
||||||
|
|
||||||
|
InitAudioDevice();
|
||||||
|
|
||||||
|
Sound fxWav = LoadSound("resources/audio/weird.wav"); // Load WAV audio file
|
||||||
|
Sound fxOgg = LoadSound("resources/audio/tanatana.ogg"); // Load OGG audio file
|
||||||
|
|
||||||
|
Music music = LoadMusicStream("resources/audio/guitar_noodling.ogg");
|
||||||
|
PlayMusicStream(music);
|
||||||
|
|
||||||
|
printf("\nPress s or d to play sounds...\n");
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main loop
|
||||||
|
while (key != KEY_ESCAPE)
|
||||||
|
{
|
||||||
|
if (kbhit()) key = getch();
|
||||||
|
|
||||||
|
if (key == 's')
|
||||||
|
{
|
||||||
|
PlaySound(fxWav);
|
||||||
|
key = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key == 'd')
|
||||||
|
{
|
||||||
|
PlaySound(fxOgg);
|
||||||
|
key = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateMusicStream(music);
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
UnloadSound(fxWav); // Unload sound data
|
||||||
|
UnloadSound(fxOgg); // Unload sound data
|
||||||
|
|
||||||
|
UnloadMusicStream(music); // Unload music stream data
|
||||||
|
|
||||||
|
CloseAudioDevice();
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -350,9 +350,6 @@ static void GetShaderLightsLocations(Shader shader)
|
||||||
|
|
||||||
// Set shader uniform values for lights
|
// Set shader uniform values for lights
|
||||||
// NOTE: It would be far easier with shader UBOs but are not supported on OpenGL ES 2.0
|
// NOTE: It would be far easier with shader UBOs but are not supported on OpenGL ES 2.0
|
||||||
// TODO: Replace glUniform1i(), glUniform1f(), glUniform3f(), glUniform4f():
|
|
||||||
//SetShaderValue(Shader shader, int uniformLoc, float *value, int size)
|
|
||||||
//SetShaderValuei(Shader shader, int uniformLoc, int *value, int size)
|
|
||||||
static void SetShaderLightsValues(Shader shader)
|
static void SetShaderLightsValues(Shader shader)
|
||||||
{
|
{
|
||||||
int tempInt[8] = { 0 };
|
int tempInt[8] = { 0 };
|
||||||
|
|
@ -363,20 +360,20 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
if (i < lightsCount)
|
if (i < lightsCount)
|
||||||
{
|
{
|
||||||
tempInt[0] = lights[i]->enabled;
|
tempInt[0] = lights[i]->enabled;
|
||||||
SetShaderValuei(shader, lightsLocs[i][0], tempInt, 1); //glUniform1i(lightsLocs[i][0], lights[i]->enabled);
|
SetShaderValue(shader, lightsLocs[i][0], tempInt, UNIFORM_INT); //glUniform1i(lightsLocs[i][0], lights[i]->enabled);
|
||||||
|
|
||||||
tempInt[0] = lights[i]->type;
|
tempInt[0] = lights[i]->type;
|
||||||
SetShaderValuei(shader, lightsLocs[i][1], tempInt, 1); //glUniform1i(lightsLocs[i][1], lights[i]->type);
|
SetShaderValue(shader, lightsLocs[i][1], tempInt, UNIFORM_INT); //glUniform1i(lightsLocs[i][1], lights[i]->type);
|
||||||
|
|
||||||
tempFloat[0] = (float)lights[i]->diffuse.r/255.0f;
|
tempFloat[0] = (float)lights[i]->diffuse.r/255.0f;
|
||||||
tempFloat[1] = (float)lights[i]->diffuse.g/255.0f;
|
tempFloat[1] = (float)lights[i]->diffuse.g/255.0f;
|
||||||
tempFloat[2] = (float)lights[i]->diffuse.b/255.0f;
|
tempFloat[2] = (float)lights[i]->diffuse.b/255.0f;
|
||||||
tempFloat[3] = (float)lights[i]->diffuse.a/255.0f;
|
tempFloat[3] = (float)lights[i]->diffuse.a/255.0f;
|
||||||
SetShaderValue(shader, lightsLocs[i][5], tempFloat, 4);
|
SetShaderValue(shader, lightsLocs[i][5], tempFloat, UNIFORM_VEC4);
|
||||||
//glUniform4f(lightsLocs[i][5], (float)lights[i]->diffuse.r/255, (float)lights[i]->diffuse.g/255, (float)lights[i]->diffuse.b/255, (float)lights[i]->diffuse.a/255);
|
//glUniform4f(lightsLocs[i][5], (float)lights[i]->diffuse.r/255, (float)lights[i]->diffuse.g/255, (float)lights[i]->diffuse.b/255, (float)lights[i]->diffuse.a/255);
|
||||||
|
|
||||||
tempFloat[0] = lights[i]->intensity;
|
tempFloat[0] = lights[i]->intensity;
|
||||||
SetShaderValue(shader, lightsLocs[i][6], tempFloat, 1);
|
SetShaderValue(shader, lightsLocs[i][6], tempFloat, UNIFORM_FLOAT);
|
||||||
|
|
||||||
switch (lights[i]->type)
|
switch (lights[i]->type)
|
||||||
{
|
{
|
||||||
|
|
@ -385,10 +382,10 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
tempFloat[0] = lights[i]->position.x;
|
tempFloat[0] = lights[i]->position.x;
|
||||||
tempFloat[1] = lights[i]->position.y;
|
tempFloat[1] = lights[i]->position.y;
|
||||||
tempFloat[2] = lights[i]->position.z;
|
tempFloat[2] = lights[i]->position.z;
|
||||||
SetShaderValue(shader, lightsLocs[i][2], tempFloat, 3);
|
SetShaderValue(shader, lightsLocs[i][2], tempFloat, UNIFORM_VEC3);
|
||||||
|
|
||||||
tempFloat[0] = lights[i]->radius;
|
tempFloat[0] = lights[i]->radius;
|
||||||
SetShaderValue(shader, lightsLocs[i][4], tempFloat, 1);
|
SetShaderValue(shader, lightsLocs[i][4], tempFloat, UNIFORM_FLOAT);
|
||||||
|
|
||||||
//glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z);
|
//glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z);
|
||||||
//glUniform1f(lightsLocs[i][4], lights[i]->radius);
|
//glUniform1f(lightsLocs[i][4], lights[i]->radius);
|
||||||
|
|
@ -401,7 +398,7 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
tempFloat[0] = direction.x;
|
tempFloat[0] = direction.x;
|
||||||
tempFloat[1] = direction.y;
|
tempFloat[1] = direction.y;
|
||||||
tempFloat[2] = direction.z;
|
tempFloat[2] = direction.z;
|
||||||
SetShaderValue(shader, lightsLocs[i][3], tempFloat, 3);
|
SetShaderValue(shader, lightsLocs[i][3], tempFloat, UNIFORM_VEC3);
|
||||||
|
|
||||||
//glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z);
|
//glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z);
|
||||||
} break;
|
} break;
|
||||||
|
|
@ -410,7 +407,7 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
tempFloat[0] = lights[i]->position.x;
|
tempFloat[0] = lights[i]->position.x;
|
||||||
tempFloat[1] = lights[i]->position.y;
|
tempFloat[1] = lights[i]->position.y;
|
||||||
tempFloat[2] = lights[i]->position.z;
|
tempFloat[2] = lights[i]->position.z;
|
||||||
SetShaderValue(shader, lightsLocs[i][2], tempFloat, 3);
|
SetShaderValue(shader, lightsLocs[i][2], tempFloat, UNIFORM_VEC3);
|
||||||
|
|
||||||
//glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z);
|
//glUniform3f(lightsLocs[i][2], lights[i]->position.x, lights[i]->position.y, lights[i]->position.z);
|
||||||
|
|
||||||
|
|
@ -420,11 +417,11 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
tempFloat[0] = direction.x;
|
tempFloat[0] = direction.x;
|
||||||
tempFloat[1] = direction.y;
|
tempFloat[1] = direction.y;
|
||||||
tempFloat[2] = direction.z;
|
tempFloat[2] = direction.z;
|
||||||
SetShaderValue(shader, lightsLocs[i][3], tempFloat, 3);
|
SetShaderValue(shader, lightsLocs[i][3], tempFloat, UNIFORM_VEC3);
|
||||||
//glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z);
|
//glUniform3f(lightsLocs[i][3], direction.x, direction.y, direction.z);
|
||||||
|
|
||||||
tempFloat[0] = lights[i]->coneAngle;
|
tempFloat[0] = lights[i]->coneAngle;
|
||||||
SetShaderValue(shader, lightsLocs[i][7], tempFloat, 1);
|
SetShaderValue(shader, lightsLocs[i][7], tempFloat, UNIFORM_FLOAT);
|
||||||
//glUniform1f(lightsLocs[i][7], lights[i]->coneAngle);
|
//glUniform1f(lightsLocs[i][7], lights[i]->coneAngle);
|
||||||
} break;
|
} break;
|
||||||
default: break;
|
default: break;
|
||||||
|
|
@ -433,7 +430,7 @@ static void SetShaderLightsValues(Shader shader)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tempInt[0] = 0;
|
tempInt[0] = 0;
|
||||||
SetShaderValuei(shader, lightsLocs[i][0], tempInt, 1); //glUniform1i(lightsLocs[i][0], 0); // Light disabled
|
SetShaderValue(shader, lightsLocs[i][0], tempInt, UNIFORM_INT); //glUniform1i(lightsLocs[i][0], 0); // Light disabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
examples/shaders/resources/shaders/glsl100/palette-switch.fs
Normal file
29
examples/shaders/resources/shaders/glsl100/palette-switch.fs
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#version 100
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
const int colors = 8;
|
||||||
|
|
||||||
|
// Input vertex attributes (from vertex shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec4 fragColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform sampler2D texture0;
|
||||||
|
uniform ivec3 palette[colors];
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Texel color fetching from texture sampler
|
||||||
|
vec4 texelColor = texture(texture0, fragTexCoord) * fragColor;
|
||||||
|
|
||||||
|
// Convert the (normalized) texel color RED component (GB would work, too)
|
||||||
|
// to the palette index by scaling up from [0, 1] to [0, 255].
|
||||||
|
int index = int(texelColor.r * 255.0);
|
||||||
|
ivec3 color = palette[index];
|
||||||
|
|
||||||
|
// Calculate final fragment color. Note that the palette color components
|
||||||
|
// are defined in the range [0, 255] and need to be normalized to [0, 1]
|
||||||
|
// for OpenGL to work.
|
||||||
|
gl_FragColor = vec4(color / 255.0, texelColor.a);
|
||||||
|
}
|
||||||
27
examples/shaders/resources/shaders/glsl120/palette-switch.fs
Normal file
27
examples/shaders/resources/shaders/glsl120/palette-switch.fs
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
#version 120
|
||||||
|
|
||||||
|
const int colors = 8;
|
||||||
|
|
||||||
|
// Input fragment attributes (from fragment shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec4 fragColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform sampler2D texture0;
|
||||||
|
uniform ivec3 palette[colors];
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Texel color fetching from texture sampler
|
||||||
|
vec4 texelColor = texture(texture0, fragTexCoord) * fragColor;
|
||||||
|
|
||||||
|
// Convert the (normalized) texel color RED component (GB would work, too)
|
||||||
|
// to the palette index by scaling up from [0, 1] to [0, 255].
|
||||||
|
int index = int(texelColor.r * 255.0);
|
||||||
|
ivec3 color = palette[index];
|
||||||
|
|
||||||
|
// Calculate final fragment color. Note that the palette color components
|
||||||
|
// are defined in the range [0, 255] and need to be normalized to [0, 1]
|
||||||
|
// for OpenGL to work.
|
||||||
|
gl_FragColor = vec4(color / 255.0, texelColor.a);
|
||||||
|
}
|
||||||
30
examples/shaders/resources/shaders/glsl330/palette-switch.fs
Normal file
30
examples/shaders/resources/shaders/glsl330/palette-switch.fs
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
const int colors = 8;
|
||||||
|
|
||||||
|
// Input fragment attributes (from fragment shader)
|
||||||
|
in vec2 fragTexCoord;
|
||||||
|
in vec4 fragColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform sampler2D texture0;
|
||||||
|
uniform ivec3 palette[colors];
|
||||||
|
|
||||||
|
// Output fragment color
|
||||||
|
out vec4 finalColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Texel color fetching from texture sampler
|
||||||
|
vec4 texelColor = texture(texture0, fragTexCoord)*fragColor;
|
||||||
|
|
||||||
|
// Convert the (normalized) texel color RED component (GB would work, too)
|
||||||
|
// to the palette index by scaling up from [0, 1] to [0, 255].
|
||||||
|
int index = int(texelColor.r * 255.0);
|
||||||
|
ivec3 color = palette[index];
|
||||||
|
|
||||||
|
// Calculate final fragment color. Note that the palette color components
|
||||||
|
// are defined in the range [0, 255] and need to be normalized to [0, 1]
|
||||||
|
// for OpenGL to work.
|
||||||
|
finalColor = vec4(color / 255.0, texelColor.a);
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue