Merge branch 'raysan5:master' into master
This commit is contained in:
commit
873db2c89d
2
.github/workflows/webassembly.yml
vendored
2
.github/workflows/webassembly.yml
vendored
|
|
@ -29,7 +29,7 @@ jobs:
|
||||||
- name: Setup emsdk
|
- name: Setup emsdk
|
||||||
uses: mymindstorm/setup-emsdk@v14
|
uses: mymindstorm/setup-emsdk@v14
|
||||||
with:
|
with:
|
||||||
version: 3.1.54
|
version: 3.1.64
|
||||||
actions-cache-folder: 'emsdk-cache'
|
actions-cache-folder: 'emsdk-cache'
|
||||||
|
|
||||||
- name: Setup Release Version
|
- name: Setup Release Version
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
||||||
| [raylib](https://github.com/raysan5/raylib) | **5.0** | [C/C++](https://en.wikipedia.org/wiki/C_(programming_language)) | Zlib |
|
| [raylib](https://github.com/raysan5/raylib) | **5.0** | [C/C++](https://en.wikipedia.org/wiki/C_(programming_language)) | Zlib |
|
||||||
| [raylib-beef](https://github.com/Starpelly/raylib-beef) | **5.0** | [Beef](https://www.beeflang.org) | MIT |
|
| [raylib-beef](https://github.com/Starpelly/raylib-beef) | **5.0** | [Beef](https://www.beeflang.org) | MIT |
|
||||||
| [raylib-boo](https://github.com/Rabios/raylib-boo) | 3.7 | [Boo](http://boo-language.github.io) | MIT |
|
| [raylib-boo](https://github.com/Rabios/raylib-boo) | 3.7 | [Boo](http://boo-language.github.io) | MIT |
|
||||||
|
| [raybit](https://github.com/Alex-Velez/raybit) | 3.7 | [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck) | MIT |
|
||||||
| [Raylib-cs](https://github.com/ChrisDill/Raylib-cs) | **5.0** | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | Zlib |
|
| [Raylib-cs](https://github.com/ChrisDill/Raylib-cs) | **5.0** | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | Zlib |
|
||||||
| [Raylib-CsLo](https://github.com/NotNotTech/Raylib-CsLo) | 4.2 | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | MPL-2.0 |
|
| [Raylib-CsLo](https://github.com/NotNotTech/Raylib-CsLo) | 4.2 | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | MPL-2.0 |
|
||||||
| [Raylib-CSharp-Vinculum](https://github.com/ZeroElectric/Raylib-CSharp-Vinculum) | **5.0** | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | MPL-2.0 |
|
| [Raylib-CSharp-Vinculum](https://github.com/ZeroElectric/Raylib-CSharp-Vinculum) | **5.0** | [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)) | MPL-2.0 |
|
||||||
|
|
@ -21,7 +22,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
||||||
| [ray-cyber](https://github.com/fubark/ray-cyber) | **5.0** | [Cyber](https://cyberscript.dev) | MIT |
|
| [ray-cyber](https://github.com/fubark/ray-cyber) | **5.0** | [Cyber](https://cyberscript.dev) | MIT |
|
||||||
| [dart-raylib](https://gitlab.com/wolfenrain/dart-raylib) | 4.0 | [Dart](https://dart.dev) | MIT |
|
| [dart-raylib](https://gitlab.com/wolfenrain/dart-raylib) | 4.0 | [Dart](https://dart.dev) | MIT |
|
||||||
| [bindbc-raylib3](https://github.com/o3o/bindbc-raylib3) | **5.0** | [D](https://dlang.org) | BSL-1.0 |
|
| [bindbc-raylib3](https://github.com/o3o/bindbc-raylib3) | **5.0** | [D](https://dlang.org) | BSL-1.0 |
|
||||||
| [dray](https://github.com/redthing1/dray) | 4.2 | [D](https://dlang.org) | Apache-2.0 |
|
| [dray](https://github.com/redthing1/dray) | **5.0** | [D](https://dlang.org) | Apache-2.0 |
|
||||||
| [raylib-d](https://github.com/schveiguy/raylib-d) | **5.0** | [D](https://dlang.org) | Zlib |
|
| [raylib-d](https://github.com/schveiguy/raylib-d) | **5.0** | [D](https://dlang.org) | Zlib |
|
||||||
| [rayex](https://github.com/shiryel/rayex) | 3.7 | [elixir](https://elixir-lang.org) | Apache-2.0 |
|
| [rayex](https://github.com/shiryel/rayex) | 3.7 | [elixir](https://elixir-lang.org) | Apache-2.0 |
|
||||||
| [raylib-factor](https://github.com/factor/factor/blob/master/extra/raylib/raylib.factor) | 4.5 | [Factor](https://factorcode.org) | BSD |
|
| [raylib-factor](https://github.com/factor/factor/blob/master/extra/raylib/raylib.factor) | 4.5 | [Factor](https://factorcode.org) | BSD |
|
||||||
|
|
@ -82,6 +83,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
||||||
| [raylib-raku](https://github.com/vushu/raylib-raku) | **auto** | [Raku](https://www.raku.org) | Artistic License 2.0 |
|
| [raylib-raku](https://github.com/vushu/raylib-raku) | **auto** | [Raku](https://www.raku.org) | Artistic License 2.0 |
|
||||||
| [Raylib.lean](https://github.com/KislyjKisel/Raylib.lean) | 4.5 | [Lean4](https://lean-lang.org) | BSD-3-Clause |
|
| [Raylib.lean](https://github.com/KislyjKisel/Raylib.lean) | 4.5 | [Lean4](https://lean-lang.org) | BSD-3-Clause |
|
||||||
| [raylib-cobol](https://codeberg.org/glowiak/raylib-cobol) | **auto** | [COBOL](https://gnucobol.sourceforge.io) | Public domain |
|
| [raylib-cobol](https://codeberg.org/glowiak/raylib-cobol) | **auto** | [COBOL](https://gnucobol.sourceforge.io) | Public domain |
|
||||||
|
| [raylib-apl](https://github.com/Brian-ED/raylib-apl) | **5.0** | [Dyalog APL](https://www.dyalog.com/) | MIT |
|
||||||
|
|
||||||
### Utility Wrapers
|
### Utility Wrapers
|
||||||
|
|
||||||
|
|
@ -149,7 +151,7 @@ These are older raylib bindings that are more than 2 versions old or have not be
|
||||||
| [ray.mod](https://github.com/bmx-ng/ray.mod) | 3.0 | [BlitzMax](https://blitzmax.org) |
|
| [ray.mod](https://github.com/bmx-ng/ray.mod) | 3.0 | [BlitzMax](https://blitzmax.org) |
|
||||||
| [raylib-mosaic](https://github.com/pluckyporcupine/raylib-mosaic) | 3.0 | [Mosaic](https://github.com/sal55/langs/tree/master/Mosaic) |
|
| [raylib-mosaic](https://github.com/pluckyporcupine/raylib-mosaic) | 3.0 | [Mosaic](https://github.com/sal55/langs/tree/master/Mosaic) |
|
||||||
| [raylib-xdpw](https://github.com/vtereshkov/raylib-xdpw) | 2.6 | [XD Pascal](https://github.com/vtereshkov/xdpw) |
|
| [raylib-xdpw](https://github.com/vtereshkov/raylib-xdpw) | 2.6 | [XD Pascal](https://github.com/vtereshkov/xdpw) |
|
||||||
| [raylib-carp](https://github.com/pluckyporcupine/raylib-carp) | 3.0 | [Carp](https://github.com/carp-lang/Carp) |
|
| [raylib-carp](https://github.com/sacredbirdman/raylib-carp) | 3.0 | [Carp](https://github.com/carp-lang/Carp) |
|
||||||
| [raylib-fb](https://github.com/IchMagBier/raylib-fb) | 3.0 | [FreeBasic](https://www.freebasic.net) |
|
| [raylib-fb](https://github.com/IchMagBier/raylib-fb) | 3.0 | [FreeBasic](https://www.freebasic.net) |
|
||||||
| [raylib-purebasic](https://github.com/D-a-n-i-l-o/raylib-purebasic) | 3.0 | [PureBasic](https://www.purebasic.com) |
|
| [raylib-purebasic](https://github.com/D-a-n-i-l-o/raylib-purebasic) | 3.0 | [PureBasic](https://www.purebasic.com) |
|
||||||
| [raylib-ats2](https://github.com/mephistopheles-8/raylib-ats2) | 3.0 | [ATS2](http://www.ats-lang.org) |
|
| [raylib-ats2](https://github.com/mephistopheles-8/raylib-ats2) | 3.0 | [ATS2](http://www.ats-lang.org) |
|
||||||
|
|
|
||||||
|
|
@ -36,9 +36,6 @@ include(CompilerFlags)
|
||||||
# Registers build options that are exposed to cmake
|
# Registers build options that are exposed to cmake
|
||||||
include(CMakeOptions.txt)
|
include(CMakeOptions.txt)
|
||||||
|
|
||||||
# Enforces a few environment and compiler configurations
|
|
||||||
include(BuildOptions)
|
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
if (UNIX AND NOT APPLE)
|
||||||
if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11)
|
if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11)
|
||||||
MESSAGE(FATAL_ERROR "Cannot disable both Wayland and X11")
|
MESSAGE(FATAL_ERROR "Cannot disable both Wayland and X11")
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ option(ENABLE_MSAN "Enable MemorySanitizer (MSan) for debugging (not recommended
|
||||||
# Shared library is always PIC. Static library should be PIC too if linked into a shared library
|
# Shared library is always PIC. Static library should be PIC too if linked into a shared library
|
||||||
option(WITH_PIC "Compile static library as position-independent code" OFF)
|
option(WITH_PIC "Compile static library as position-independent code" OFF)
|
||||||
option(BUILD_SHARED_LIBS "Build raylib as a shared library" OFF)
|
option(BUILD_SHARED_LIBS "Build raylib as a shared library" OFF)
|
||||||
option(MACOS_FATLIB "Build fat library for both i386 and x86_64 on macOS" OFF)
|
|
||||||
cmake_dependent_option(USE_AUDIO "Build raylib with audio module" ON CUSTOMIZE_BUILD ON)
|
cmake_dependent_option(USE_AUDIO "Build raylib with audio module" ON CUSTOMIZE_BUILD ON)
|
||||||
|
|
||||||
enum_option(USE_EXTERNAL_GLFW "OFF;IF_POSSIBLE;ON" "Link raylib against system GLFW instead of embedded one")
|
enum_option(USE_EXTERNAL_GLFW "OFF;IF_POSSIBLE;ON" "Link raylib against system GLFW instead of embedded one")
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
if(${PLATFORM} MATCHES "Desktop" AND APPLE)
|
|
||||||
if(MACOS_FATLIB)
|
|
||||||
if (CMAKE_OSX_ARCHITECTURES)
|
|
||||||
message(FATAL_ERROR "User supplied -DCMAKE_OSX_ARCHITECTURES overrides -DMACOS_FATLIB=ON")
|
|
||||||
else()
|
|
||||||
set(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# This helps support the case where emsdk toolchain file is used
|
|
||||||
# either by setting it with -DCMAKE_TOOLCHAIN_FILE=<path_to_emsdk>/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
|
|
||||||
# or by using "emcmake cmake -B build -S ." as described in https://emscripten.org/docs/compiling/Building-Projects.html
|
|
||||||
if(EMSCRIPTEN)
|
|
||||||
SET(PLATFORM Web CACHE STRING "Forcing PLATFORM_WEB because EMSCRIPTEN was detected")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# vim: ft=cmake
|
|
||||||
|
|
@ -11,7 +11,6 @@ endfunction()
|
||||||
|
|
||||||
if(${CUSTOMIZE_BUILD})
|
if(${CUSTOMIZE_BUILD})
|
||||||
target_compile_definitions("raylib" PRIVATE EXTERNAL_CONFIG_FLAGS)
|
target_compile_definitions("raylib" PRIVATE EXTERNAL_CONFIG_FLAGS)
|
||||||
define_if("raylib" USE_AUDIO)
|
|
||||||
|
|
||||||
foreach(FLAG IN LISTS CONFIG_HEADER_FLAGS)
|
foreach(FLAG IN LISTS CONFIG_HEADER_FLAGS)
|
||||||
string(REGEX MATCH "([^=]+)=(.+)" _ ${FLAG})
|
string(REGEX MATCH "([^=]+)=(.+)" _ ${FLAG})
|
||||||
|
|
|
||||||
|
|
@ -479,6 +479,7 @@ CORE = \
|
||||||
core/core_automation_events \
|
core/core_automation_events \
|
||||||
core/core_basic_screen_manager \
|
core/core_basic_screen_manager \
|
||||||
core/core_basic_window \
|
core/core_basic_window \
|
||||||
|
core/core_basic_window_web \
|
||||||
core/core_custom_frame_control \
|
core/core_custom_frame_control \
|
||||||
core/core_custom_logging \
|
core/core_custom_logging \
|
||||||
core/core_drop_files \
|
core/core_drop_files \
|
||||||
|
|
@ -528,6 +529,7 @@ TEXTURES = \
|
||||||
textures/textures_draw_tiled \
|
textures/textures_draw_tiled \
|
||||||
textures/textures_fog_of_war \
|
textures/textures_fog_of_war \
|
||||||
textures/textures_gif_player \
|
textures/textures_gif_player \
|
||||||
|
textures/textures_image_channel \
|
||||||
textures/textures_image_drawing \
|
textures/textures_image_drawing \
|
||||||
textures/textures_image_generation \
|
textures/textures_image_generation \
|
||||||
textures/textures_image_kernel \
|
textures/textures_image_kernel \
|
||||||
|
|
@ -566,6 +568,7 @@ TEXT = \
|
||||||
MODELS = \
|
MODELS = \
|
||||||
models/models_animation \
|
models/models_animation \
|
||||||
models/models_billboard \
|
models/models_billboard \
|
||||||
|
models/models_bone_socket \
|
||||||
models/models_box_collisions \
|
models/models_box_collisions \
|
||||||
models/models_cubicmap \
|
models/models_cubicmap \
|
||||||
models/models_draw_cube_texture \
|
models/models_draw_cube_texture \
|
||||||
|
|
@ -586,6 +589,7 @@ MODELS = \
|
||||||
|
|
||||||
SHADERS = \
|
SHADERS = \
|
||||||
shaders/shaders_basic_lighting \
|
shaders/shaders_basic_lighting \
|
||||||
|
shaders/shaders_basic_pbr \
|
||||||
shaders/shaders_custom_uniform \
|
shaders/shaders_custom_uniform \
|
||||||
shaders/shaders_deferred_render \
|
shaders/shaders_deferred_render \
|
||||||
shaders/shaders_eratosthenes \
|
shaders/shaders_eratosthenes \
|
||||||
|
|
@ -608,7 +612,8 @@ SHADERS = \
|
||||||
shaders/shaders_texture_outline \
|
shaders/shaders_texture_outline \
|
||||||
shaders/shaders_texture_tiling \
|
shaders/shaders_texture_tiling \
|
||||||
shaders/shaders_texture_waves \
|
shaders/shaders_texture_waves \
|
||||||
shaders/shaders_write_depth
|
shaders/shaders_write_depth \
|
||||||
|
shaders/shaders_vertex_displacement
|
||||||
|
|
||||||
AUDIO = \
|
AUDIO = \
|
||||||
audio/audio_mixed_processor \
|
audio/audio_mixed_processor \
|
||||||
|
|
|
||||||
|
|
@ -476,7 +476,8 @@ SHADERS = \
|
||||||
shaders/shaders_texture_outline \
|
shaders/shaders_texture_outline \
|
||||||
shaders/shaders_texture_tiling \
|
shaders/shaders_texture_tiling \
|
||||||
shaders/shaders_texture_waves \
|
shaders/shaders_texture_waves \
|
||||||
shaders/shaders_write_depth
|
shaders/shaders_write_depth \
|
||||||
|
shaders/shaders_vertex_displacement
|
||||||
|
|
||||||
AUDIO = \
|
AUDIO = \
|
||||||
audio/audio_mixed_processor \
|
audio/audio_mixed_processor \
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,7 @@ Examples using raylib shaders functionality, including shaders loading, paramete
|
||||||
| 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
| 115 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
||||||
| 116 | [shaders_spotlight](shaders/shaders_spotlight.c) | <img src="shaders/shaders_spotlight.png" alt="shaders_spotlight" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
|
| 116 | [shaders_spotlight](shaders/shaders_spotlight.c) | <img src="shaders/shaders_spotlight.png" alt="shaders_spotlight" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/codifies) |
|
||||||
| 117 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | <img src="shaders/shaders_deferred_render.png" alt="shaders_deferred_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
|
| 117 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | <img src="shaders/shaders_deferred_render.png" alt="shaders_deferred_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
|
||||||
|
| 118 | [shaders_vertex_displacement](shaders/shaders_vertex_displacement.c) | <img src="shaders/shaders_vertex_displacement.png" alt="shaders_deferred_render" width="80"> | ⭐️☆☆☆ | 1.5 | 1.5 | [Alex ZH](https://github.com/ZzzhHe) |
|
||||||
|
|
||||||
### category: audio
|
### category: audio
|
||||||
|
|
||||||
|
|
@ -185,10 +186,10 @@ Examples using raylib audio functionality, including sound/music loading and pla
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
|
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
|
||||||
| 118 | [audio_module_playing](audio/audio_module_playing.c) | <img src="audio/audio_module_playing.png" alt="audio_module_playing" width="80"> | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
| 119 | [audio_module_playing](audio/audio_module_playing.c) | <img src="audio/audio_module_playing.png" alt="audio_module_playing" width="80"> | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
||||||
| 119 | [audio_music_stream](audio/audio_music_stream.c) | <img src="audio/audio_music_stream.png" alt="audio_music_stream" width="80"> | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) |
|
| 120 | [audio_music_stream](audio/audio_music_stream.c) | <img src="audio/audio_music_stream.png" alt="audio_music_stream" width="80"> | ⭐️☆☆☆ | 1.3 | **4.2** | [Ray](https://github.com/raysan5) |
|
||||||
| 120 | [audio_raw_stream](audio/audio_raw_stream.c) | <img src="audio/audio_raw_stream.png" alt="audio_raw_stream" width="80"> | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) |
|
| 121 | [audio_raw_stream](audio/audio_raw_stream.c) | <img src="audio/audio_raw_stream.png" alt="audio_raw_stream" width="80"> | ⭐️⭐️⭐️☆ | 1.6 | **4.2** | [Ray](https://github.com/raysan5) |
|
||||||
| 121 | [audio_sound_loading](audio/audio_sound_loading.c) | <img src="audio/audio_sound_loading.png" alt="audio_sound_loading" width="80"> | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) |
|
| 122 | [audio_sound_loading](audio/audio_sound_loading.c) | <img src="audio/audio_sound_loading.png" alt="audio_sound_loading" width="80"> | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) |
|
||||||
|
|
||||||
### category: others
|
### category: others
|
||||||
|
|
||||||
|
|
@ -196,11 +197,11 @@ Examples showing raylib misc functionality that does not fit in other categories
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
|
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
|
||||||
| 122 | [rlgl_standalone](others/rlgl_standalone.c) | <img src="others/rlgl_standalone.png" alt="rlgl_standalone" width="80"> | ⭐️⭐️⭐️⭐️ | 1.6 | **4.0** | [Ray](https://github.com/raysan5) |
|
| 123 | [rlgl_standalone](others/rlgl_standalone.c) | <img src="others/rlgl_standalone.png" alt="rlgl_standalone" width="80"> | ⭐️⭐️⭐️⭐️ | 1.6 | **4.0** | [Ray](https://github.com/raysan5) |
|
||||||
| 123 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | <img src="others/rlgl_compute_shader.png" alt="rlgl_compute_shader" width="80"> | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Teddy Astie](https://github.com/tsnake41) |
|
| 124 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | <img src="others/rlgl_compute_shader.png" alt="rlgl_compute_shader" width="80"> | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Teddy Astie](https://github.com/tsnake41) |
|
||||||
| 124 | [easings_testbed](others/easings_testbed.c) | <img src="others/easings_testbed.png" alt="easings_testbed" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) |
|
| 125 | [easings_testbed](others/easings_testbed.c) | <img src="others/easings_testbed.png" alt="easings_testbed" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) |
|
||||||
| 125 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | <img src="others/raylib_opengl_interop.png" alt="raylib_opengl_interop" width="80"> | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Stephan Soller](https://github.com/arkanis) |
|
| 126 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | <img src="others/raylib_opengl_interop.png" alt="raylib_opengl_interop" width="80"> | ⭐️⭐️⭐️⭐️ | **4.0** | **4.0** | [Stephan Soller](https://github.com/arkanis) |
|
||||||
| 126 | [embedded_files_loading](others/embedded_files_loading.c) | <img src="others/embedded_files_loading.png" alt="embedded_files_loading" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Kristian Holmgren](https://github.com/defutura) |
|
| 127 | [embedded_files_loading](others/embedded_files_loading.c) | <img src="others/embedded_files_loading.png" alt="embedded_files_loading" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Kristian Holmgren](https://github.com/defutura) |
|
||||||
|
|
||||||
As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with!
|
As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with!
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ int main(void)
|
||||||
DrawRectangle(199, 199, 402, 34, LIGHTGRAY);
|
DrawRectangle(199, 199, 402, 34, LIGHTGRAY);
|
||||||
for (int i = 0; i < 400; i++)
|
for (int i = 0; i < 400; i++)
|
||||||
{
|
{
|
||||||
DrawLine(201 + i, 232 - (int)averageVolume[i] * 32, 201 + i, 232, MAROON);
|
DrawLine(201 + i, 232 - (int)(averageVolume[i] * 32), 201 + i, 232, MAROON);
|
||||||
}
|
}
|
||||||
DrawRectangleLines(199, 199, 402, 34, GRAY);
|
DrawRectangleLines(199, 199, 402, 34, GRAY);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ int main(void)
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
float deltaTime = 0.015f;//GetFrameTime();
|
float deltaTime = 0.015f;//GetFrameTime();
|
||||||
|
|
||||||
// Dropped files logic
|
// Dropped files logic
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
if (IsFileDropped())
|
if (IsFileDropped())
|
||||||
|
|
@ -157,11 +157,6 @@ int main(void)
|
||||||
}
|
}
|
||||||
else player.canJump = true;
|
else player.canJump = true;
|
||||||
|
|
||||||
camera.zoom += ((float)GetMouseWheelMove()*0.05f);
|
|
||||||
|
|
||||||
if (camera.zoom > 3.0f) camera.zoom = 3.0f;
|
|
||||||
else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
|
|
||||||
|
|
||||||
if (IsKeyPressed(KEY_R))
|
if (IsKeyPressed(KEY_R))
|
||||||
{
|
{
|
||||||
// Reset game state
|
// Reset game state
|
||||||
|
|
@ -176,12 +171,44 @@ int main(void)
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Events playing
|
||||||
|
// NOTE: Logic must be before Camera update because it depends on mouse-wheel value,
|
||||||
|
// that can be set by the played event... but some other inputs could be affected
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
if (eventPlaying)
|
||||||
|
{
|
||||||
|
// NOTE: Multiple events could be executed in a single frame
|
||||||
|
while (playFrameCounter == aelist.events[currentPlayFrame].frame)
|
||||||
|
{
|
||||||
|
PlayAutomationEvent(aelist.events[currentPlayFrame]);
|
||||||
|
currentPlayFrame++;
|
||||||
|
|
||||||
|
if (currentPlayFrame == aelist.count)
|
||||||
|
{
|
||||||
|
eventPlaying = false;
|
||||||
|
currentPlayFrame = 0;
|
||||||
|
playFrameCounter = 0;
|
||||||
|
|
||||||
|
TraceLog(LOG_INFO, "FINISH PLAYING!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
playFrameCounter++;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Update camera
|
// Update camera
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
camera.target = player.position;
|
camera.target = player.position;
|
||||||
camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
|
camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
|
||||||
float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
|
float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
|
||||||
|
|
||||||
|
// WARNING: On event replay, mouse-wheel internal value is set
|
||||||
|
camera.zoom += ((float)GetMouseWheelMove()*0.05f);
|
||||||
|
if (camera.zoom > 3.0f) camera.zoom = 3.0f;
|
||||||
|
else if (camera.zoom < 0.25f) camera.zoom = 0.25f;
|
||||||
|
|
||||||
for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
|
for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
|
||||||
{
|
{
|
||||||
EnvElement *element = &envElements[i];
|
EnvElement *element = &envElements[i];
|
||||||
|
|
@ -200,8 +227,8 @@ int main(void)
|
||||||
if (min.y > 0) camera.offset.y = screenHeight/2 - min.y;
|
if (min.y > 0) camera.offset.y = screenHeight/2 - min.y;
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Toggle events recording
|
// Events management
|
||||||
if (IsKeyPressed(KEY_S))
|
if (IsKeyPressed(KEY_S)) // Toggle events recording
|
||||||
{
|
{
|
||||||
if (!eventPlaying)
|
if (!eventPlaying)
|
||||||
{
|
{
|
||||||
|
|
@ -222,7 +249,7 @@ int main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (IsKeyPressed(KEY_A))
|
else if (IsKeyPressed(KEY_A)) // Toggle events playing (WARNING: Starts next frame)
|
||||||
{
|
{
|
||||||
if (!eventRecording && (aelist.count > 0))
|
if (!eventRecording && (aelist.count > 0))
|
||||||
{
|
{
|
||||||
|
|
@ -241,32 +268,7 @@ int main(void)
|
||||||
camera.zoom = 1.0f;
|
camera.zoom = 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eventPlaying)
|
|
||||||
{
|
|
||||||
// NOTE: Multiple events could be executed in a single frame
|
|
||||||
while (playFrameCounter == aelist.events[currentPlayFrame].frame)
|
|
||||||
{
|
|
||||||
TraceLog(LOG_INFO, "PLAYING: PlayFrameCount: %i | currentPlayFrame: %i | Event Frame: %i, param: %i",
|
|
||||||
playFrameCounter, currentPlayFrame, aelist.events[currentPlayFrame].frame, aelist.events[currentPlayFrame].params[0]);
|
|
||||||
|
|
||||||
PlayAutomationEvent(aelist.events[currentPlayFrame]);
|
|
||||||
currentPlayFrame++;
|
|
||||||
|
|
||||||
if (currentPlayFrame == aelist.count)
|
|
||||||
{
|
|
||||||
eventPlaying = false;
|
|
||||||
currentPlayFrame = 0;
|
|
||||||
playFrameCounter = 0;
|
|
||||||
|
|
||||||
TraceLog(LOG_INFO, "FINISH PLAYING!");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
playFrameCounter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (eventRecording || eventPlaying) frameCounter++;
|
if (eventRecording || eventPlaying) frameCounter++;
|
||||||
else frameCounter = 0;
|
else frameCounter = 0;
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -47,25 +47,25 @@ int main(void)
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
for (int i = 0, y = 10; i < 4; i++) // MAX_GAMEPADS = 4
|
for (int i = 0, y = 5; i < 4; i++) // MAX_GAMEPADS = 4
|
||||||
{
|
{
|
||||||
if (IsGamepadAvailable(i))
|
if (IsGamepadAvailable(i))
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("Gamepad name: %s", GetGamepadName(i)), 10, y, 20, BLACK);
|
DrawText(TextFormat("Gamepad name: %s", GetGamepadName(i)), 10, y, 10, BLACK);
|
||||||
y += 30;
|
y += 11;
|
||||||
DrawText(TextFormat("\tAxis count: %d", GetGamepadAxisCount(i)), 10, y, 20, BLACK);
|
DrawText(TextFormat("\tAxis count: %d", GetGamepadAxisCount(i)), 10, y, 10, BLACK);
|
||||||
y += 30;
|
y += 11;
|
||||||
|
|
||||||
for (int axis = 0; axis < GetGamepadAxisCount(i); axis++)
|
for (int axis = 0; axis < GetGamepadAxisCount(i); axis++)
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("\tAxis %d = %f", axis, GetGamepadAxisMovement(i, axis)), 10, y, 20, BLACK);
|
DrawText(TextFormat("\tAxis %d = %f", axis, GetGamepadAxisMovement(i, axis)), 10, y, 10, BLACK);
|
||||||
y += 30;
|
y += 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int button = 0; button < 32; button++)
|
for (int button = 0; button < 32; button++)
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("\tButton %d = %d", button, IsGamepadButtonDown(i, button)), 10, y, 20, BLACK);
|
DrawText(TextFormat("\tButton %d = %d", button, IsGamepadButtonDown(i, button)), 10, y, 10, BLACK);
|
||||||
y += 30;
|
y += 11;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -80,4 +80,4 @@ int main(void)
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ int main(void)
|
||||||
|
|
||||||
DisableCursor(); // Limit cursor to relative movement inside the window
|
DisableCursor(); // Limit cursor to relative movement inside the window
|
||||||
|
|
||||||
SetTargetFPS(90); // Set our game to run at 90 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ int main(void)
|
||||||
|
|
||||||
EndMode3D();
|
EndMode3D();
|
||||||
|
|
||||||
DrawText("Move player with cursors to collide", 220, 40, 20, GRAY);
|
DrawText("Move player with arrow keys to collide", 220, 40, 20, GRAY);
|
||||||
|
|
||||||
DrawFPS(10, 10);
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -114,6 +114,7 @@ int main(void)
|
||||||
// De-Initialization
|
// De-Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
UnloadModel(model); // Unload model data
|
UnloadModel(model); // Unload model data
|
||||||
|
UnloadTexture(texture); // Unload texture data
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ uniform vec2 resolution;
|
||||||
//
|
//
|
||||||
// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
|
// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
|
||||||
|
|
||||||
#define AA 1 // make this 1 is your machine is too slow
|
#define AA 1 // make this 1 if your machine is too slow
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#version 100
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
// Input vertex attributes (from fragment shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying float height;
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 darkblue = vec4(0.0, 0.13, 0.18, 1.0);
|
||||||
|
vec4 lightblue = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
// Interpolate between two colors based on height
|
||||||
|
vec4 finalColor = mix(darkblue, lightblue, height);
|
||||||
|
|
||||||
|
gl_FragColor = finalColor;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
#version 100
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
attribute vec3 vertexPosition;
|
||||||
|
attribute vec2 vertexTexCoord;
|
||||||
|
attribute vec3 vertexNormal;
|
||||||
|
attribute vec4 vertexColor;
|
||||||
|
|
||||||
|
uniform mat4 mvp;
|
||||||
|
uniform mat4 matModel;
|
||||||
|
uniform mat4 matNormal;
|
||||||
|
|
||||||
|
uniform float time;
|
||||||
|
|
||||||
|
uniform sampler2D perlinNoiseMap;
|
||||||
|
|
||||||
|
varying vec3 fragPosition;
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec3 fragNormal;
|
||||||
|
varying float height;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Calculate animated texture coordinates based on time and vertex position
|
||||||
|
vec2 animatedTexCoord = sin(vertexTexCoord + vec2(sin(time + vertexPosition.x * 0.1), cos(time + vertexPosition.z * 0.1)) * 0.3);
|
||||||
|
|
||||||
|
// Normalize animated texture coordinates to range [0, 1]
|
||||||
|
animatedTexCoord = animatedTexCoord * 0.5 + 0.5;
|
||||||
|
|
||||||
|
// Fetch displacement from the perlin noise map
|
||||||
|
float displacement = texture2D(perlinNoiseMap, animatedTexCoord).r * 7.0; // Amplified displacement
|
||||||
|
|
||||||
|
// Displace vertex position
|
||||||
|
vec3 displacedPosition = vertexPosition + vec3(0.0, displacement, 0.0);
|
||||||
|
|
||||||
|
// Send vertex attributes to fragment shader
|
||||||
|
fragPosition = vec3(matModel * vec4(displacedPosition, 1.0));
|
||||||
|
fragTexCoord = vertexTexCoord;
|
||||||
|
fragNormal = normalize(vec3(matNormal * vec4(vertexNormal, 1.0)));
|
||||||
|
height = displacedPosition.y * 0.2; // send height to fragment shader for coloring
|
||||||
|
|
||||||
|
// Calculate final vertex position
|
||||||
|
gl_Position = mvp * vec4(displacedPosition, 1.0);
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
#version 120
|
#version 120
|
||||||
|
|
||||||
precision mediump float;
|
|
||||||
|
|
||||||
#define MAX_LIGHTS 4
|
#define MAX_LIGHTS 4
|
||||||
#define LIGHT_DIRECTIONAL 0
|
#define LIGHT_DIRECTIONAL 0
|
||||||
#define LIGHT_POINT 1
|
#define LIGHT_POINT 1
|
||||||
|
|
@ -17,12 +15,12 @@ struct Light {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
// Input vertex attributes (from vertex shader)
|
||||||
varying in vec3 fragPosition;
|
varying vec3 fragPosition;
|
||||||
varying in vec2 fragTexCoord;
|
varying vec2 fragTexCoord;
|
||||||
varying in vec4 fragColor;
|
varying vec4 fragColor;
|
||||||
varying in vec3 fragNormal;
|
varying vec3 fragNormal;
|
||||||
varying in vec4 shadowPos;
|
varying vec4 shadowPos;
|
||||||
varying in mat3 TBN;
|
varying mat3 TBN;
|
||||||
|
|
||||||
|
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
|
|
@ -153,4 +151,4 @@ void main()
|
||||||
|
|
||||||
gl_FragColor = vec4(color,1.0);
|
gl_FragColor = vec4(color,1.0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
427
examples/shaders/resources/shaders/glsl120/raymarching.fs
Normal file
427
examples/shaders/resources/shaders/glsl120/raymarching.fs
Normal file
|
|
@ -0,0 +1,427 @@
|
||||||
|
#version 120
|
||||||
|
|
||||||
|
// Input vertex attributes (from vertex shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec4 fragColor;
|
||||||
|
|
||||||
|
uniform vec3 viewEye;
|
||||||
|
uniform vec3 viewCenter;
|
||||||
|
uniform float runTime;
|
||||||
|
uniform vec2 resolution;
|
||||||
|
|
||||||
|
// The MIT License
|
||||||
|
// Copyright © 2013 Inigo Quilez
|
||||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
// in the Software without restriction, including without limitation the rights
|
||||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||||
|
// furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||||
|
// copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
// SOFTWARE.
|
||||||
|
|
||||||
|
// A list of useful distance function to simple primitives, and an example on how to
|
||||||
|
// do some interesting boolean operations, repetition and displacement.
|
||||||
|
//
|
||||||
|
// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
|
||||||
|
|
||||||
|
#define AA 1 // make this 1 if your machine is too slow
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
float sdPlane( vec3 p )
|
||||||
|
{
|
||||||
|
return p.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdSphere( vec3 p, float s )
|
||||||
|
{
|
||||||
|
return length(p)-s;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdBox( vec3 p, vec3 b )
|
||||||
|
{
|
||||||
|
vec3 d = abs(p) - b;
|
||||||
|
return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdEllipsoid( in vec3 p, in vec3 r )
|
||||||
|
{
|
||||||
|
return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
float udRoundBox( vec3 p, vec3 b, float r )
|
||||||
|
{
|
||||||
|
return length(max(abs(p)-b,0.0))-r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdTorus( vec3 p, vec2 t )
|
||||||
|
{
|
||||||
|
return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdHexPrism( vec3 p, vec2 h )
|
||||||
|
{
|
||||||
|
vec3 q = abs(p);
|
||||||
|
#if 0
|
||||||
|
return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
|
||||||
|
#else
|
||||||
|
float d1 = q.z-h.y;
|
||||||
|
float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
|
||||||
|
return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
|
||||||
|
{
|
||||||
|
vec3 pa = p-a, ba = b-a;
|
||||||
|
float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
|
||||||
|
return length( pa - ba*h ) - r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdEquilateralTriangle( in vec2 p )
|
||||||
|
{
|
||||||
|
const float k = sqrt(3.0);
|
||||||
|
p.x = abs(p.x) - 1.0;
|
||||||
|
p.y = p.y + 1.0/k;
|
||||||
|
if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
|
||||||
|
p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
|
||||||
|
return -length(p)*sign(p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdTriPrism( vec3 p, vec2 h )
|
||||||
|
{
|
||||||
|
vec3 q = abs(p);
|
||||||
|
float d1 = q.z-h.y;
|
||||||
|
#if 1
|
||||||
|
// distance bound
|
||||||
|
float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
|
||||||
|
#else
|
||||||
|
// correct distance
|
||||||
|
h.x *= 0.866025;
|
||||||
|
float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
|
||||||
|
#endif
|
||||||
|
return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdCylinder( vec3 p, vec2 h )
|
||||||
|
{
|
||||||
|
vec2 d = abs(vec2(length(p.xz),p.y)) - h;
|
||||||
|
return min(max(d.x,d.y),0.0) + length(max(d,0.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdCone( in vec3 p, in vec3 c )
|
||||||
|
{
|
||||||
|
vec2 q = vec2( length(p.xz), p.y );
|
||||||
|
float d1 = -q.y-c.z;
|
||||||
|
float d2 = max( dot(q,c.xy), q.y);
|
||||||
|
return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
|
||||||
|
{
|
||||||
|
float d1 = -p.y - h;
|
||||||
|
float q = p.y - h;
|
||||||
|
float si = 0.5*(r1-r2)/h;
|
||||||
|
float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
|
||||||
|
return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
|
||||||
|
{
|
||||||
|
// Tetrahedron = Octahedron - Cube
|
||||||
|
float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
|
||||||
|
|
||||||
|
float d = 0.0;
|
||||||
|
d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
|
||||||
|
d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
|
||||||
|
d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
|
||||||
|
d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
|
||||||
|
float octa = d - h.z;
|
||||||
|
return max(-box,octa); // Subtraction
|
||||||
|
}
|
||||||
|
|
||||||
|
float length2( vec2 p )
|
||||||
|
{
|
||||||
|
return sqrt( p.x*p.x + p.y*p.y );
|
||||||
|
}
|
||||||
|
|
||||||
|
float length6( vec2 p )
|
||||||
|
{
|
||||||
|
p = p*p*p; p = p*p;
|
||||||
|
return pow( p.x + p.y, 1.0/6.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
float length8( vec2 p )
|
||||||
|
{
|
||||||
|
p = p*p; p = p*p; p = p*p;
|
||||||
|
return pow( p.x + p.y, 1.0/8.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdTorus82( vec3 p, vec2 t )
|
||||||
|
{
|
||||||
|
vec2 q = vec2(length2(p.xz)-t.x,p.y);
|
||||||
|
return length8(q)-t.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdTorus88( vec3 p, vec2 t )
|
||||||
|
{
|
||||||
|
vec2 q = vec2(length8(p.xz)-t.x,p.y);
|
||||||
|
return length8(q)-t.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdCylinder6( vec3 p, vec2 h )
|
||||||
|
{
|
||||||
|
return max( length6(p.xz)-h.x, abs(p.y)-h.y );
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
float opS( float d1, float d2 )
|
||||||
|
{
|
||||||
|
return max(-d2,d1);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 opU( vec2 d1, vec2 d2 )
|
||||||
|
{
|
||||||
|
return (d1.x<d2.x) ? d1 : d2;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 opRep( vec3 p, vec3 c )
|
||||||
|
{
|
||||||
|
return mod(p,c)-0.5*c;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 opTwist( vec3 p )
|
||||||
|
{
|
||||||
|
float c = cos(10.0*p.y+10.0);
|
||||||
|
float s = sin(10.0*p.y+10.0);
|
||||||
|
mat2 m = mat2(c,-s,s,c);
|
||||||
|
return vec3(m*p.xz,p.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
vec2 map( in vec3 pos )
|
||||||
|
{
|
||||||
|
vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
|
||||||
|
vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
|
||||||
|
res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
|
||||||
|
res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
|
||||||
|
res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
|
||||||
|
res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
|
||||||
|
res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
|
||||||
|
res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
|
||||||
|
res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
|
||||||
|
res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
|
||||||
|
res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
|
||||||
|
res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
|
||||||
|
res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
|
||||||
|
res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
|
||||||
|
res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
|
||||||
|
sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
|
||||||
|
res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
|
||||||
|
sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
|
||||||
|
res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
|
||||||
|
res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
|
||||||
|
res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
|
||||||
|
res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 castRay( in vec3 ro, in vec3 rd )
|
||||||
|
{
|
||||||
|
float tmin = 0.2;
|
||||||
|
float tmax = 30.0;
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// bounding volume
|
||||||
|
float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
|
||||||
|
float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
|
||||||
|
else tmax = min( tmax, tp2 ); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float t = tmin;
|
||||||
|
float m = -1.0;
|
||||||
|
for( int i=0; i<64; i++ )
|
||||||
|
{
|
||||||
|
float precis = 0.0005*t;
|
||||||
|
vec2 res = map( ro+rd*t );
|
||||||
|
if( res.x<precis || t>tmax ) break;
|
||||||
|
t += res.x;
|
||||||
|
m = res.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( t>tmax ) m=-1.0;
|
||||||
|
return vec2( t, m );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
|
||||||
|
{
|
||||||
|
float res = 1.0;
|
||||||
|
float t = mint;
|
||||||
|
for( int i=0; i<16; i++ )
|
||||||
|
{
|
||||||
|
float h = map( ro + rd*t ).x;
|
||||||
|
res = min( res, 8.0*h/t );
|
||||||
|
t += clamp( h, 0.02, 0.10 );
|
||||||
|
if( h<0.001 || t>tmax ) break;
|
||||||
|
}
|
||||||
|
return clamp( res, 0.0, 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 calcNormal( in vec3 pos )
|
||||||
|
{
|
||||||
|
vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
|
||||||
|
return normalize( e.xyy*map( pos + e.xyy ).x +
|
||||||
|
e.yyx*map( pos + e.yyx ).x +
|
||||||
|
e.yxy*map( pos + e.yxy ).x +
|
||||||
|
e.xxx*map( pos + e.xxx ).x );
|
||||||
|
/*
|
||||||
|
vec3 eps = vec3( 0.0005, 0.0, 0.0 );
|
||||||
|
vec3 nor = vec3(
|
||||||
|
map(pos+eps.xyy).x - map(pos-eps.xyy).x,
|
||||||
|
map(pos+eps.yxy).x - map(pos-eps.yxy).x,
|
||||||
|
map(pos+eps.yyx).x - map(pos-eps.yyx).x );
|
||||||
|
return normalize(nor);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
float calcAO( in vec3 pos, in vec3 nor )
|
||||||
|
{
|
||||||
|
float occ = 0.0;
|
||||||
|
float sca = 1.0;
|
||||||
|
for( int i=0; i<5; i++ )
|
||||||
|
{
|
||||||
|
float hr = 0.01 + 0.12*float(i)/4.0;
|
||||||
|
vec3 aopos = nor * hr + pos;
|
||||||
|
float dd = map( aopos ).x;
|
||||||
|
occ += -(dd-hr)*sca;
|
||||||
|
sca *= 0.95;
|
||||||
|
}
|
||||||
|
return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
|
||||||
|
float checkersGradBox( in vec2 p )
|
||||||
|
{
|
||||||
|
// filter kernel
|
||||||
|
vec2 w = fwidth(p) + 0.001;
|
||||||
|
// analytical integral (box filter)
|
||||||
|
vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
|
||||||
|
// xor pattern
|
||||||
|
return 0.5 - 0.5*i.x*i.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 render( in vec3 ro, in vec3 rd )
|
||||||
|
{
|
||||||
|
vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
|
||||||
|
vec2 res = castRay(ro,rd);
|
||||||
|
float t = res.x;
|
||||||
|
float m = res.y;
|
||||||
|
if( m>-0.5 )
|
||||||
|
{
|
||||||
|
vec3 pos = ro + t*rd;
|
||||||
|
vec3 nor = calcNormal( pos );
|
||||||
|
vec3 ref = reflect( rd, nor );
|
||||||
|
|
||||||
|
// material
|
||||||
|
col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
|
||||||
|
if( m<1.5 )
|
||||||
|
{
|
||||||
|
|
||||||
|
float f = checkersGradBox( 5.0*pos.xz );
|
||||||
|
col = 0.3 + f*vec3(0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// lighting
|
||||||
|
float occ = calcAO( pos, nor );
|
||||||
|
vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
|
||||||
|
vec3 hal = normalize( lig-rd );
|
||||||
|
float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
|
||||||
|
float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
|
||||||
|
float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
|
||||||
|
float dom = smoothstep( -0.1, 0.1, ref.y );
|
||||||
|
float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
|
||||||
|
|
||||||
|
dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
|
||||||
|
dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
|
||||||
|
|
||||||
|
float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
|
||||||
|
dif *
|
||||||
|
(0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
|
||||||
|
|
||||||
|
vec3 lin = vec3(0.0);
|
||||||
|
lin += 1.30*dif*vec3(1.00,0.80,0.55);
|
||||||
|
lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
|
||||||
|
lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
|
||||||
|
lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
|
||||||
|
lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
|
||||||
|
col = col*lin;
|
||||||
|
col += 10.00*spe*vec3(1.00,0.90,0.70);
|
||||||
|
|
||||||
|
col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return vec3( clamp(col,0.0,1.0) );
|
||||||
|
}
|
||||||
|
|
||||||
|
mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
|
||||||
|
{
|
||||||
|
vec3 cw = normalize(ta-ro);
|
||||||
|
vec3 cp = vec3(sin(cr), cos(cr),0.0);
|
||||||
|
vec3 cu = normalize( cross(cw,cp) );
|
||||||
|
vec3 cv = normalize( cross(cu,cw) );
|
||||||
|
return mat3( cu, cv, cw );
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec3 tot = vec3(0.0);
|
||||||
|
#if AA>1
|
||||||
|
for( int m=0; m<AA; m++ )
|
||||||
|
for( int n=0; n<AA; n++ )
|
||||||
|
{
|
||||||
|
// pixel coordinates
|
||||||
|
vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
|
||||||
|
vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
|
||||||
|
#else
|
||||||
|
vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// RAY: Camera is provided from raylib
|
||||||
|
//vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
|
||||||
|
|
||||||
|
vec3 ro = viewEye;
|
||||||
|
vec3 ta = viewCenter;
|
||||||
|
|
||||||
|
// camera-to-world transformation
|
||||||
|
mat3 ca = setCamera( ro, ta, 0.0 );
|
||||||
|
// ray direction
|
||||||
|
vec3 rd = ca * normalize( vec3(p.xy,2.0) );
|
||||||
|
|
||||||
|
// render
|
||||||
|
vec3 col = render( ro, rd );
|
||||||
|
|
||||||
|
// gamma
|
||||||
|
col = pow( col, vec3(0.4545) );
|
||||||
|
|
||||||
|
tot += col;
|
||||||
|
#if AA>1
|
||||||
|
}
|
||||||
|
tot /= float(AA*AA);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gl_FragColor = vec4( tot, 1.0 );
|
||||||
|
}
|
||||||
|
|
@ -1,15 +1,13 @@
|
||||||
#version 120
|
#version 120
|
||||||
|
|
||||||
precision mediump float;
|
|
||||||
|
|
||||||
// This shader is based on the basic lighting shader
|
// This shader is based on the basic lighting shader
|
||||||
// This only supports one light, which is directional, and it (of course) supports shadows
|
// This only supports one light, which is directional, and it (of course) supports shadows
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
// Input vertex attributes (from vertex shader)
|
||||||
varying in vec3 fragPosition;
|
varying vec3 fragPosition;
|
||||||
varying in vec2 fragTexCoord;
|
varying vec2 fragTexCoord;
|
||||||
//varying in vec4 fragColor;
|
//varying in vec4 fragColor;
|
||||||
varying in vec3 fragNormal;
|
varying vec3 fragNormal;
|
||||||
|
|
||||||
// Input uniform values
|
// Input uniform values
|
||||||
uniform sampler2D texture0;
|
uniform sampler2D texture0;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
// Input fragment attributes (from fragment shader)
|
||||||
|
in vec2 fragTexCoord;
|
||||||
|
in float height;
|
||||||
|
|
||||||
|
// Output fragment color
|
||||||
|
out vec4 finalColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 darkblue = vec4(0.0, 0.13, 0.18, 1.0);
|
||||||
|
vec4 lightblue = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
// interplate between two colors based on height
|
||||||
|
finalColor = mix(darkblue, lightblue, height);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
// Input vertex attributes
|
||||||
|
in vec3 vertexPosition;
|
||||||
|
in vec2 vertexTexCoord;
|
||||||
|
in vec3 vertexNormal;
|
||||||
|
in vec4 vertexColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform mat4 mvp;
|
||||||
|
uniform mat4 matModel;
|
||||||
|
uniform mat4 matNormal;
|
||||||
|
|
||||||
|
uniform float time;
|
||||||
|
|
||||||
|
uniform sampler2D perlinNoiseMap;
|
||||||
|
|
||||||
|
// Output vertex attributes (to fragment shader)
|
||||||
|
out vec3 fragPosition;
|
||||||
|
out vec2 fragTexCoord;
|
||||||
|
out vec3 fragNormal;
|
||||||
|
out float height;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Calculate animated texture coordinates based on time and vertex position
|
||||||
|
vec2 animatedTexCoord = sin(vertexTexCoord + vec2(sin(time + vertexPosition.x * 0.1), cos(time + vertexPosition.z * 0.1)) * 0.3);
|
||||||
|
|
||||||
|
// Normalize animated texture coordinates to range [0, 1]
|
||||||
|
animatedTexCoord = animatedTexCoord * 0.5 + 0.5;
|
||||||
|
|
||||||
|
// Fetch displacement from the perlin noise map
|
||||||
|
float displacement = texture(perlinNoiseMap, animatedTexCoord).r * 7; // Amplified displacement
|
||||||
|
|
||||||
|
// Displace vertex position
|
||||||
|
vec3 displacedPosition = vertexPosition + vec3(0.0, displacement, 0.0);
|
||||||
|
|
||||||
|
// Send vertex attributes to fragment shader
|
||||||
|
fragPosition = vec3(matModel*vec4(displacedPosition, 1.0));
|
||||||
|
fragTexCoord = vertexTexCoord;
|
||||||
|
fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
|
||||||
|
height = displacedPosition.y * 0.2; // send height to fragment shader for coloring
|
||||||
|
|
||||||
|
// Calculate final vertex position
|
||||||
|
gl_Position = mvp*vec4(displacedPosition , 1.0);
|
||||||
|
}
|
||||||
|
|
@ -236,7 +236,7 @@ int main()
|
||||||
float emissiveIntensity = 0.01f;
|
float emissiveIntensity = 0.01f;
|
||||||
SetShaderValue(shader, emissiveIntensityLoc, &emissiveIntensity, SHADER_UNIFORM_FLOAT);
|
SetShaderValue(shader, emissiveIntensityLoc, &emissiveIntensity, SHADER_UNIFORM_FLOAT);
|
||||||
|
|
||||||
DrawModel(car, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.005f, WHITE); // Draw car model
|
DrawModel(car, (Vector3){ 0.0f, 0.0f, 0.0f }, 0.25f, WHITE); // Draw car model
|
||||||
|
|
||||||
// Draw spheres to show the lights positions
|
// Draw spheres to show the lights positions
|
||||||
for (int i = 0; i < MAX_LIGHTS; i++)
|
for (int i = 0; i < MAX_LIGHTS; i++)
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,8 @@ int main(void)
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
UnloadMesh(mesh); // Unload the mesh
|
UnloadMesh(mesh); // Unload the mesh
|
||||||
UnloadShader(shader); // Unload shader
|
UnloadShader(shader); // Unload shader
|
||||||
|
UnloadTexture(texture); // Unload texture
|
||||||
|
UnloadTexture(light); // Unload texture
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ int main(void)
|
||||||
// De-Initialization
|
// De-Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
UnloadShader(shader);
|
UnloadShader(shader);
|
||||||
|
UnloadTexture(texture);
|
||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
119
examples/shaders/shaders_vertex_displacement.c
Normal file
119
examples/shaders/shaders_vertex_displacement.c
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [shaders] example - Vertex displacement
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.0, last time updated with raylib 4.5
|
||||||
|
*
|
||||||
|
* Example contributed by <Alex ZH> (@ZzzhHe) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example 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) 2023 <Alex ZH> (@ZzzhHe)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include "rlgl.h"
|
||||||
|
|
||||||
|
#define RLIGHTS_IMPLEMENTATION
|
||||||
|
#include "rlights.h"
|
||||||
|
|
||||||
|
#if defined(PLATFORM_DESKTOP)
|
||||||
|
#define GLSL_VERSION 330
|
||||||
|
#else // PLATFORM_ANDROID, PLATFORM_WEB
|
||||||
|
#define GLSL_VERSION 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - vertex displacement");
|
||||||
|
|
||||||
|
// set up camera
|
||||||
|
Camera camera = {0};
|
||||||
|
camera.position = (Vector3) {20.0f, 5.0f, -20.0f};
|
||||||
|
camera.target = (Vector3) {0.0f, 0.0f, 0.0f};
|
||||||
|
camera.up = (Vector3) {0.0f, 1.0f, 0.0f};
|
||||||
|
camera.fovy = 60.0f;
|
||||||
|
camera.projection = CAMERA_PERSPECTIVE;
|
||||||
|
|
||||||
|
// Load vertex and fragment shaders
|
||||||
|
Shader shader = LoadShader(
|
||||||
|
TextFormat("resources/shaders/glsl%i/vertex_displacement.vs", GLSL_VERSION),
|
||||||
|
TextFormat("resources/shaders/glsl%i/vertex_displacement.fs", GLSL_VERSION));
|
||||||
|
|
||||||
|
// Load perlin noise texture
|
||||||
|
Image perlinNoiseImage = GenImagePerlinNoise(512, 512, 0, 0, 1.0f);
|
||||||
|
Texture perlinNoiseMap = LoadTextureFromImage(perlinNoiseImage);
|
||||||
|
UnloadImage(perlinNoiseImage);
|
||||||
|
|
||||||
|
// Set shader uniform location
|
||||||
|
int perlinNoiseMapLoc = GetShaderLocation(shader, "perlinNoiseMap");
|
||||||
|
rlEnableShader(shader.id);
|
||||||
|
rlActiveTextureSlot(1);
|
||||||
|
rlEnableTexture(perlinNoiseMap.id);
|
||||||
|
rlSetUniformSampler(perlinNoiseMapLoc, 1);
|
||||||
|
|
||||||
|
// Create a plane mesh and model
|
||||||
|
Mesh planeMesh = GenMeshPlane(50, 50, 50, 50);
|
||||||
|
Model planeModel = LoadModelFromMesh(planeMesh);
|
||||||
|
// Set plane model material
|
||||||
|
planeModel.materials[0].shader = shader;
|
||||||
|
|
||||||
|
float time = 0.0f;
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
UpdateCamera(&camera, CAMERA_FREE); // Update camera
|
||||||
|
|
||||||
|
time += GetFrameTime(); // Update time variable
|
||||||
|
SetShaderValue(shader, GetShaderLocation(shader, "time"), &time, SHADER_UNIFORM_FLOAT); // Send time value to shader
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
BeginMode3D(camera);
|
||||||
|
|
||||||
|
BeginShaderMode(shader);
|
||||||
|
// Draw plane model
|
||||||
|
DrawModel(planeModel, (Vector3){ 0.0f, 0.0f, 0.0f }, 1.0f, (Color) {255, 255, 255, 255});
|
||||||
|
EndShaderMode();
|
||||||
|
|
||||||
|
EndMode3D();
|
||||||
|
|
||||||
|
DrawText("Vertex displacement", 10, 10, 20, DARKGRAY);
|
||||||
|
DrawFPS(10, 40);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
UnloadShader(shader);
|
||||||
|
UnloadModel(planeModel);
|
||||||
|
UnloadTexture(perlinNoiseMap);
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/shaders/shaders_vertex_displacement.png
Normal file
BIN
examples/shaders/shaders_vertex_displacement.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 302 KiB |
File diff suppressed because it is too large
Load Diff
|
|
@ -62,7 +62,7 @@ int main(void)
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
DrawCircleV(ballPosition, (float)ballRadius, MAROON);
|
DrawCircleV(ballPosition, (float)ballRadius, MAROON);
|
||||||
//DrawText("PRESS SPACE to PAUSE BALL MOVEMENT", 10, GetScreenHeight() - 25, 20, LIGHTGRAY);
|
DrawText("PRESS SPACE to PAUSE BALL MOVEMENT", 10, GetScreenHeight() - 25, 20, LIGHTGRAY);
|
||||||
|
|
||||||
// On pause, we draw a blinking message
|
// On pause, we draw a blinking message
|
||||||
if (pause && ((framesCounter/30)%2)) DrawText("PAUSED", 350, 200, 30, GRAY);
|
if (pause && ((framesCounter/30)%2)) DrawText("PAUSED", 350, 200, 30, GRAY);
|
||||||
|
|
|
||||||
|
|
@ -63,11 +63,11 @@ int main(void)
|
||||||
|
|
||||||
// Draw GUI controls
|
// Draw GUI controls
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
GuiSliderBar((Rectangle){ 600, 40, 120, 20}, "StartAngle", NULL, &startAngle, 0, 720);
|
GuiSliderBar((Rectangle){ 600, 40, 120, 20}, "StartAngle", TextFormat("%.2f", startAngle), &startAngle, 0, 720);
|
||||||
GuiSliderBar((Rectangle){ 600, 70, 120, 20}, "EndAngle", NULL, &endAngle, 0, 720);
|
GuiSliderBar((Rectangle){ 600, 70, 120, 20}, "EndAngle", TextFormat("%.2f", endAngle), &endAngle, 0, 720);
|
||||||
|
|
||||||
GuiSliderBar((Rectangle){ 600, 140, 120, 20}, "Radius", NULL, &outerRadius, 0, 200);
|
GuiSliderBar((Rectangle){ 600, 140, 120, 20}, "Radius", TextFormat("%.2f", outerRadius), &outerRadius, 0, 200);
|
||||||
GuiSliderBar((Rectangle){ 600, 170, 120, 20}, "Segments", NULL, &segments, 0, 100);
|
GuiSliderBar((Rectangle){ 600, 170, 120, 20}, "Segments", TextFormat("%.2f", segments), &segments, 0, 100);
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
minSegments = truncf(ceilf((endAngle - startAngle) / 90));
|
minSegments = truncf(ceilf((endAngle - startAngle) / 90));
|
||||||
|
|
|
||||||
|
|
@ -66,11 +66,11 @@ int main(void)
|
||||||
|
|
||||||
// Draw GUI controls
|
// Draw GUI controls
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
GuiSliderBar((Rectangle){ 640, 40, 105, 20 }, "Width", NULL, &width, 0, (float)GetScreenWidth() - 300);
|
GuiSliderBar((Rectangle){ 640, 40, 105, 20 }, "Width", TextFormat("%.2f", width), &width, 0, (float)GetScreenWidth() - 300);
|
||||||
GuiSliderBar((Rectangle){ 640, 70, 105, 20 }, "Height", NULL, &height, 0, (float)GetScreenHeight() - 50);
|
GuiSliderBar((Rectangle){ 640, 70, 105, 20 }, "Height", TextFormat("%.2f", height), &height, 0, (float)GetScreenHeight() - 50);
|
||||||
GuiSliderBar((Rectangle){ 640, 140, 105, 20 }, "Roundness", NULL, &roundness, 0.0f, 1.0f);
|
GuiSliderBar((Rectangle){ 640, 140, 105, 20 }, "Roundness", TextFormat("%.2f", roundness), &roundness, 0.0f, 1.0f);
|
||||||
GuiSliderBar((Rectangle){ 640, 170, 105, 20 }, "Thickness", NULL, &lineThick, 0, 20);
|
GuiSliderBar((Rectangle){ 640, 170, 105, 20 }, "Thickness", TextFormat("%.2f", lineThick), &lineThick, 0, 20);
|
||||||
GuiSliderBar((Rectangle){ 640, 240, 105, 20}, "Segments", NULL, &segments, 0, 60);
|
GuiSliderBar((Rectangle){ 640, 240, 105, 20}, "Segments", TextFormat("%.2f", segments), &segments, 0, 60);
|
||||||
|
|
||||||
GuiCheckBox((Rectangle){ 640, 320, 20, 20 }, "DrawRoundedRect", &drawRoundedRect);
|
GuiCheckBox((Rectangle){ 640, 320, 20, 20 }, "DrawRoundedRect", &drawRoundedRect);
|
||||||
GuiCheckBox((Rectangle){ 640, 350, 20, 20 }, "DrawRoundedLines", &drawRoundedLines);
|
GuiCheckBox((Rectangle){ 640, 350, 20, 20 }, "DrawRoundedLines", &drawRoundedLines);
|
||||||
|
|
|
||||||
|
|
@ -69,13 +69,13 @@ int main(void)
|
||||||
|
|
||||||
// Draw GUI controls
|
// Draw GUI controls
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
GuiSliderBar((Rectangle){ 600, 40, 120, 20 }, "StartAngle", NULL, &startAngle, -450, 450);
|
GuiSliderBar((Rectangle){ 600, 40, 120, 20 }, "StartAngle", TextFormat("%.2f", startAngle), &startAngle, -450, 450);
|
||||||
GuiSliderBar((Rectangle){ 600, 70, 120, 20 }, "EndAngle", NULL, &endAngle, -450, 450);
|
GuiSliderBar((Rectangle){ 600, 70, 120, 20 }, "EndAngle", TextFormat("%.2f", endAngle), &endAngle, -450, 450);
|
||||||
|
|
||||||
GuiSliderBar((Rectangle){ 600, 140, 120, 20 }, "InnerRadius", NULL, &innerRadius, 0, 100);
|
GuiSliderBar((Rectangle){ 600, 140, 120, 20 }, "InnerRadius", TextFormat("%.2f", innerRadius), &innerRadius, 0, 100);
|
||||||
GuiSliderBar((Rectangle){ 600, 170, 120, 20 }, "OuterRadius", NULL, &outerRadius, 0, 200);
|
GuiSliderBar((Rectangle){ 600, 170, 120, 20 }, "OuterRadius", TextFormat("%.2f", outerRadius), &outerRadius, 0, 200);
|
||||||
|
|
||||||
GuiSliderBar((Rectangle){ 600, 240, 120, 20 }, "Segments", NULL, &segments, 0, 100);
|
GuiSliderBar((Rectangle){ 600, 240, 120, 20 }, "Segments", TextFormat("%.2f", segments), &segments, 0, 100);
|
||||||
|
|
||||||
GuiCheckBox((Rectangle){ 600, 320, 20, 20 }, "Draw Ring", &drawRing);
|
GuiCheckBox((Rectangle){ 600, 320, 20, 20 }, "Draw Ring", &drawRing);
|
||||||
GuiCheckBox((Rectangle){ 600, 350, 20, 20 }, "Draw RingLines", &drawRingLines);
|
GuiCheckBox((Rectangle){ 600, 350, 20, 20 }, "Draw RingLines", &drawRingLines);
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ int main(void)
|
||||||
|
|
||||||
int framesCounter = 0;
|
int framesCounter = 0;
|
||||||
|
|
||||||
SetTargetFPS(10); // Set our game to run at 10 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ int main(void)
|
||||||
DrawText(TextSubtext(message, 0, framesCounter/10), 210, 160, 20, MAROON);
|
DrawText(TextSubtext(message, 0, framesCounter/10), 210, 160, 20, MAROON);
|
||||||
|
|
||||||
DrawText("PRESS [ENTER] to RESTART!", 240, 260, 20, LIGHTGRAY);
|
DrawText("PRESS [ENTER] to RESTART!", 240, 260, 20, LIGHTGRAY);
|
||||||
DrawText("PRESS [SPACE] to SPEED UP!", 239, 300, 20, LIGHTGRAY);
|
DrawText("HOLD [SPACE] to SPEED UP!", 239, 300, 20, LIGHTGRAY);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,9 @@ int main(void)
|
||||||
const int blendCountMax = 4;
|
const int blendCountMax = 4;
|
||||||
BlendMode blendMode = 0;
|
BlendMode blendMode = 0;
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@ int main(void)
|
||||||
textures[2] = LoadTextureFromImage(imageNeg90);
|
textures[2] = LoadTextureFromImage(imageNeg90);
|
||||||
|
|
||||||
int currentTexture = 0;
|
int currentTexture = 0;
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ int main(void)
|
||||||
|
|
||||||
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
||||||
Texture2D texture = LoadTexture("resources/raylib_logo.png"); // Texture loading
|
Texture2D texture = LoadTexture("resources/raylib_logo.png"); // Texture loading
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,8 @@ int main(void)
|
||||||
|
|
||||||
Texture2D checked = LoadTextureFromImage(checkedIm);
|
Texture2D checked = LoadTextureFromImage(checkedIm);
|
||||||
UnloadImage(checkedIm); // Unload CPU (RAM) image data (pixels)
|
UnloadImage(checkedIm); // Unload CPU (RAM) image data (pixels)
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,8 @@ int main(void)
|
||||||
bool active = false;
|
bool active = false;
|
||||||
int framesCounter = 0;
|
int framesCounter = 0;
|
||||||
|
|
||||||
SetTargetFPS(120);
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ int main(void)
|
||||||
|
|
||||||
texture = LoadTextureFromImage(image); // Recreate texture from retrieved image data (RAM -> VRAM)
|
texture = LoadTextureFromImage(image); // Recreate texture from retrieved image data (RAM -> VRAM)
|
||||||
UnloadImage(image); // Unload retrieved image data from CPU memory (RAM)
|
UnloadImage(image); // Unload retrieved image data from CPU memory (RAM)
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
{
|
{
|
||||||
"name": "RAYLIB_VERSION",
|
"name": "RAYLIB_VERSION",
|
||||||
"type": "STRING",
|
"type": "STRING",
|
||||||
"value": "5.5",
|
"value": "5.5-dev",
|
||||||
"description": ""
|
"description": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -5485,11 +5485,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color1"
|
"name": "inner"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color2"
|
"name": "outer"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -5785,11 +5785,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color1"
|
"name": "top"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color2"
|
"name": "bottom"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -5816,11 +5816,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color1"
|
"name": "left"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "color2"
|
"name": "right"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -5835,19 +5835,19 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "col1"
|
"name": "topLeft"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "col2"
|
"name": "bottomLeft"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "col3"
|
"name": "topRight"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "Color",
|
"type": "Color",
|
||||||
"name": "col4"
|
"name": "bottomRight"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ return {
|
||||||
{
|
{
|
||||||
name = "RAYLIB_VERSION",
|
name = "RAYLIB_VERSION",
|
||||||
type = "STRING",
|
type = "STRING",
|
||||||
value = "5.5",
|
value = "5.5-dev",
|
||||||
description = ""
|
description = ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -4697,8 +4697,8 @@ return {
|
||||||
{type = "int", name = "centerX"},
|
{type = "int", name = "centerX"},
|
||||||
{type = "int", name = "centerY"},
|
{type = "int", name = "centerY"},
|
||||||
{type = "float", name = "radius"},
|
{type = "float", name = "radius"},
|
||||||
{type = "Color", name = "color1"},
|
{type = "Color", name = "inner"},
|
||||||
{type = "Color", name = "color2"}
|
{type = "Color", name = "outer"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -4835,8 +4835,8 @@ return {
|
||||||
{type = "int", name = "posY"},
|
{type = "int", name = "posY"},
|
||||||
{type = "int", name = "width"},
|
{type = "int", name = "width"},
|
||||||
{type = "int", name = "height"},
|
{type = "int", name = "height"},
|
||||||
{type = "Color", name = "color1"},
|
{type = "Color", name = "top"},
|
||||||
{type = "Color", name = "color2"}
|
{type = "Color", name = "bottom"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -4848,8 +4848,8 @@ return {
|
||||||
{type = "int", name = "posY"},
|
{type = "int", name = "posY"},
|
||||||
{type = "int", name = "width"},
|
{type = "int", name = "width"},
|
||||||
{type = "int", name = "height"},
|
{type = "int", name = "height"},
|
||||||
{type = "Color", name = "color1"},
|
{type = "Color", name = "left"},
|
||||||
{type = "Color", name = "color2"}
|
{type = "Color", name = "right"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -4858,10 +4858,10 @@ return {
|
||||||
returnType = "void",
|
returnType = "void",
|
||||||
params = {
|
params = {
|
||||||
{type = "Rectangle", name = "rec"},
|
{type = "Rectangle", name = "rec"},
|
||||||
{type = "Color", name = "col1"},
|
{type = "Color", name = "topLeft"},
|
||||||
{type = "Color", name = "col2"},
|
{type = "Color", name = "bottomLeft"},
|
||||||
{type = "Color", name = "col3"},
|
{type = "Color", name = "topRight"},
|
||||||
{type = "Color", name = "col4"}
|
{type = "Color", name = "bottomRight"}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ Define 004: RAYLIB_VERSION_PATCH
|
||||||
Define 005: RAYLIB_VERSION
|
Define 005: RAYLIB_VERSION
|
||||||
Name: RAYLIB_VERSION
|
Name: RAYLIB_VERSION
|
||||||
Type: STRING
|
Type: STRING
|
||||||
Value: "5.5"
|
Value: "5.5-dev"
|
||||||
Description:
|
Description:
|
||||||
Define 006: __declspec(x)
|
Define 006: __declspec(x)
|
||||||
Name: __declspec(x)
|
Name: __declspec(x)
|
||||||
|
|
@ -2176,8 +2176,8 @@ Function 217: DrawCircleGradient() (5 input parameters)
|
||||||
Param[1]: centerX (type: int)
|
Param[1]: centerX (type: int)
|
||||||
Param[2]: centerY (type: int)
|
Param[2]: centerY (type: int)
|
||||||
Param[3]: radius (type: float)
|
Param[3]: radius (type: float)
|
||||||
Param[4]: color1 (type: Color)
|
Param[4]: inner (type: Color)
|
||||||
Param[5]: color2 (type: Color)
|
Param[5]: outer (type: Color)
|
||||||
Function 218: DrawCircleV() (3 input parameters)
|
Function 218: DrawCircleV() (3 input parameters)
|
||||||
Name: DrawCircleV
|
Name: DrawCircleV
|
||||||
Return type: void
|
Return type: void
|
||||||
|
|
@ -2278,8 +2278,8 @@ Function 229: DrawRectangleGradientV() (6 input parameters)
|
||||||
Param[2]: posY (type: int)
|
Param[2]: posY (type: int)
|
||||||
Param[3]: width (type: int)
|
Param[3]: width (type: int)
|
||||||
Param[4]: height (type: int)
|
Param[4]: height (type: int)
|
||||||
Param[5]: color1 (type: Color)
|
Param[5]: top (type: Color)
|
||||||
Param[6]: color2 (type: Color)
|
Param[6]: bottom (type: Color)
|
||||||
Function 230: DrawRectangleGradientH() (6 input parameters)
|
Function 230: DrawRectangleGradientH() (6 input parameters)
|
||||||
Name: DrawRectangleGradientH
|
Name: DrawRectangleGradientH
|
||||||
Return type: void
|
Return type: void
|
||||||
|
|
@ -2288,17 +2288,17 @@ Function 230: DrawRectangleGradientH() (6 input parameters)
|
||||||
Param[2]: posY (type: int)
|
Param[2]: posY (type: int)
|
||||||
Param[3]: width (type: int)
|
Param[3]: width (type: int)
|
||||||
Param[4]: height (type: int)
|
Param[4]: height (type: int)
|
||||||
Param[5]: color1 (type: Color)
|
Param[5]: left (type: Color)
|
||||||
Param[6]: color2 (type: Color)
|
Param[6]: right (type: Color)
|
||||||
Function 231: DrawRectangleGradientEx() (5 input parameters)
|
Function 231: DrawRectangleGradientEx() (5 input parameters)
|
||||||
Name: DrawRectangleGradientEx
|
Name: DrawRectangleGradientEx
|
||||||
Return type: void
|
Return type: void
|
||||||
Description: Draw a gradient-filled rectangle with custom vertex colors
|
Description: Draw a gradient-filled rectangle with custom vertex colors
|
||||||
Param[1]: rec (type: Rectangle)
|
Param[1]: rec (type: Rectangle)
|
||||||
Param[2]: col1 (type: Color)
|
Param[2]: topLeft (type: Color)
|
||||||
Param[3]: col2 (type: Color)
|
Param[3]: bottomLeft (type: Color)
|
||||||
Param[4]: col3 (type: Color)
|
Param[4]: topRight (type: Color)
|
||||||
Param[5]: col4 (type: Color)
|
Param[5]: bottomRight (type: Color)
|
||||||
Function 232: DrawRectangleLines() (5 input parameters)
|
Function 232: DrawRectangleLines() (5 input parameters)
|
||||||
Name: DrawRectangleLines
|
Name: DrawRectangleLines
|
||||||
Return type: void
|
Return type: void
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<Define name="RAYLIB_VERSION_MAJOR" type="INT" value="5" desc="" />
|
<Define name="RAYLIB_VERSION_MAJOR" type="INT" value="5" desc="" />
|
||||||
<Define name="RAYLIB_VERSION_MINOR" type="INT" value="5" desc="" />
|
<Define name="RAYLIB_VERSION_MINOR" type="INT" value="5" desc="" />
|
||||||
<Define name="RAYLIB_VERSION_PATCH" type="INT" value="0" desc="" />
|
<Define name="RAYLIB_VERSION_PATCH" type="INT" value="0" desc="" />
|
||||||
<Define name="RAYLIB_VERSION" type="STRING" value="5.5" desc="" />
|
<Define name="RAYLIB_VERSION" type="STRING" value="5.5-dev" desc="" />
|
||||||
<Define name="__declspec(x)" type="MACRO" value="__attribute__((x))" desc="" />
|
<Define name="__declspec(x)" type="MACRO" value="__attribute__((x))" desc="" />
|
||||||
<Define name="RLAPI" type="UNKNOWN" value="__declspec(dllexport)" desc="We are building the library as a Win32 shared library (.dll)" />
|
<Define name="RLAPI" type="UNKNOWN" value="__declspec(dllexport)" desc="We are building the library as a Win32 shared library (.dll)" />
|
||||||
<Define name="PI" type="FLOAT" value="3.14159265358979323846" desc="" />
|
<Define name="PI" type="FLOAT" value="3.14159265358979323846" desc="" />
|
||||||
|
|
@ -1353,8 +1353,8 @@
|
||||||
<Param type="int" name="centerX" desc="" />
|
<Param type="int" name="centerX" desc="" />
|
||||||
<Param type="int" name="centerY" desc="" />
|
<Param type="int" name="centerY" desc="" />
|
||||||
<Param type="float" name="radius" desc="" />
|
<Param type="float" name="radius" desc="" />
|
||||||
<Param type="Color" name="color1" desc="" />
|
<Param type="Color" name="inner" desc="" />
|
||||||
<Param type="Color" name="color2" desc="" />
|
<Param type="Color" name="outer" desc="" />
|
||||||
</Function>
|
</Function>
|
||||||
<Function name="DrawCircleV" retType="void" paramCount="3" desc="Draw a color-filled circle (Vector version)">
|
<Function name="DrawCircleV" retType="void" paramCount="3" desc="Draw a color-filled circle (Vector version)">
|
||||||
<Param type="Vector2" name="center" desc="" />
|
<Param type="Vector2" name="center" desc="" />
|
||||||
|
|
@ -1431,23 +1431,23 @@
|
||||||
<Param type="int" name="posY" desc="" />
|
<Param type="int" name="posY" desc="" />
|
||||||
<Param type="int" name="width" desc="" />
|
<Param type="int" name="width" desc="" />
|
||||||
<Param type="int" name="height" desc="" />
|
<Param type="int" name="height" desc="" />
|
||||||
<Param type="Color" name="color1" desc="" />
|
<Param type="Color" name="top" desc="" />
|
||||||
<Param type="Color" name="color2" desc="" />
|
<Param type="Color" name="bottom" desc="" />
|
||||||
</Function>
|
</Function>
|
||||||
<Function name="DrawRectangleGradientH" retType="void" paramCount="6" desc="Draw a horizontal-gradient-filled rectangle">
|
<Function name="DrawRectangleGradientH" retType="void" paramCount="6" desc="Draw a horizontal-gradient-filled rectangle">
|
||||||
<Param type="int" name="posX" desc="" />
|
<Param type="int" name="posX" desc="" />
|
||||||
<Param type="int" name="posY" desc="" />
|
<Param type="int" name="posY" desc="" />
|
||||||
<Param type="int" name="width" desc="" />
|
<Param type="int" name="width" desc="" />
|
||||||
<Param type="int" name="height" desc="" />
|
<Param type="int" name="height" desc="" />
|
||||||
<Param type="Color" name="color1" desc="" />
|
<Param type="Color" name="left" desc="" />
|
||||||
<Param type="Color" name="color2" desc="" />
|
<Param type="Color" name="right" desc="" />
|
||||||
</Function>
|
</Function>
|
||||||
<Function name="DrawRectangleGradientEx" retType="void" paramCount="5" desc="Draw a gradient-filled rectangle with custom vertex colors">
|
<Function name="DrawRectangleGradientEx" retType="void" paramCount="5" desc="Draw a gradient-filled rectangle with custom vertex colors">
|
||||||
<Param type="Rectangle" name="rec" desc="" />
|
<Param type="Rectangle" name="rec" desc="" />
|
||||||
<Param type="Color" name="col1" desc="" />
|
<Param type="Color" name="topLeft" desc="" />
|
||||||
<Param type="Color" name="col2" desc="" />
|
<Param type="Color" name="bottomLeft" desc="" />
|
||||||
<Param type="Color" name="col3" desc="" />
|
<Param type="Color" name="topRight" desc="" />
|
||||||
<Param type="Color" name="col4" desc="" />
|
<Param type="Color" name="bottomRight" desc="" />
|
||||||
</Function>
|
</Function>
|
||||||
<Function name="DrawRectangleLines" retType="void" paramCount="5" desc="Draw rectangle outline">
|
<Function name="DrawRectangleLines" retType="void" paramCount="5" desc="Draw rectangle outline">
|
||||||
<Param type="int" name="posX" desc="" />
|
<Param type="int" name="posX" desc="" />
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,8 @@ if (NOT raylib_FOUND) # If there's none, fetch and build raylib
|
||||||
FetchContent_GetProperties(raylib)
|
FetchContent_GetProperties(raylib)
|
||||||
if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
|
if (NOT raylib_POPULATED) # Have we downloaded raylib yet?
|
||||||
set(FETCHCONTENT_QUIET NO)
|
set(FETCHCONTENT_QUIET NO)
|
||||||
FetchContent_Populate(raylib)
|
FetchContent_MakeAvailable(raylib)
|
||||||
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
|
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) # don't build the supplied examples
|
||||||
add_subdirectory(${raylib_SOURCE_DIR} ${raylib_BINARY_DIR})
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ set(raylib_public_headers
|
||||||
|
|
||||||
# Sources to be compiled
|
# Sources to be compiled
|
||||||
set(raylib_sources
|
set(raylib_sources
|
||||||
|
raudio.c
|
||||||
rcore.c
|
rcore.c
|
||||||
rmodels.c
|
rmodels.c
|
||||||
rshapes.c
|
rshapes.c
|
||||||
|
|
@ -47,14 +48,12 @@ endif ()
|
||||||
# Produces a variable LIBS_PRIVATE that will be used later
|
# Produces a variable LIBS_PRIVATE that will be used later
|
||||||
include(LibraryConfigurations)
|
include(LibraryConfigurations)
|
||||||
|
|
||||||
if (USE_AUDIO)
|
if (SUPPORT_MODULE_RAUDIO)
|
||||||
MESSAGE(STATUS "Audio Backend: miniaudio")
|
MESSAGE(STATUS "Audio Backend: miniaudio")
|
||||||
list(APPEND raylib_sources raudio.c)
|
|
||||||
else ()
|
else ()
|
||||||
MESSAGE(STATUS "Audio Backend: None (-DUSE_AUDIO=OFF)")
|
MESSAGE(STATUS "Audio Backend: None (-DCUSTOMIZE_BUILD=ON -DSUPPORT_MODULE_RAUDIO=OFF)")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
add_library(raylib ${raylib_sources} ${raylib_public_headers})
|
add_library(raylib ${raylib_sources} ${raylib_public_headers})
|
||||||
|
|
||||||
if (NOT BUILD_SHARED_LIBS)
|
if (NOT BUILD_SHARED_LIBS)
|
||||||
|
|
@ -71,7 +70,8 @@ endif()
|
||||||
if (${PLATFORM} MATCHES "Web")
|
if (${PLATFORM} MATCHES "Web")
|
||||||
target_link_options(raylib PUBLIC "-sUSE_GLFW=3")
|
target_link_options(raylib PUBLIC "-sUSE_GLFW=3")
|
||||||
if(${GRAPHICS} MATCHES "GRAPHICS_API_OPENGL_ES3")
|
if(${GRAPHICS} MATCHES "GRAPHICS_API_OPENGL_ES3")
|
||||||
target_link_options(raylib PUBLIC "-sFULL_ES3")
|
target_link_options(raylib PUBLIC "-sMIN_WEBGL_VERSION=2")
|
||||||
|
target_link_options(raylib PUBLIC "-sMAX_WEBGL_VERSION=2")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -467,7 +467,7 @@ INCLUDE_PATHS = -I.
|
||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
||||||
INCLUDE_PATHS += -Iexternal/glfw/include
|
INCLUDE_PATHS += -Iexternal/glfw/include
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
INCLUDE_PATHS += -I/usr/local/include
|
INCLUDE_PATHS += -I/usr/local/include -I/usr/pkg/include -I/usr/X11R7/include
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL)
|
||||||
|
|
@ -522,7 +522,7 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
||||||
LDFLAGS += -Wl,-soname,lib$(RAYLIB_LIB_NAME).so.$(RAYLIB_API_VERSION)
|
LDFLAGS += -Wl,-soname,lib$(RAYLIB_LIB_NAME).so.$(RAYLIB_API_VERSION)
|
||||||
endif
|
endif
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
LDFLAGS += -Wl,-soname,lib$(RAYLIB_LIB_NAME).$(RAYLIB_API_VERSION).so -Lsrc -L/usr/local/lib
|
LDFLAGS += -Wl,-soname,lib$(RAYLIB_LIB_NAME).$(RAYLIB_API_VERSION).so -Lsrc -L/usr/local/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL)
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ pub fn addRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
||||||
.shared = options.shared,
|
.shared = options.shared,
|
||||||
.linux_display_backend = options.linux_display_backend,
|
.linux_display_backend = options.linux_display_backend,
|
||||||
.opengl_version = options.opengl_version,
|
.opengl_version = options.opengl_version,
|
||||||
|
.config = options.config,
|
||||||
});
|
});
|
||||||
const raylib = raylib_dep.artifact("raylib");
|
const raylib = raylib_dep.artifact("raylib");
|
||||||
|
|
||||||
|
|
@ -52,6 +53,36 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
||||||
"-DGL_SILENCE_DEPRECATION=199309L",
|
"-DGL_SILENCE_DEPRECATION=199309L",
|
||||||
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
|
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
|
||||||
});
|
});
|
||||||
|
if (options.config) |config| {
|
||||||
|
const file = try std.fs.path.join(b.allocator, &.{ std.fs.path.dirname(@src().file) orelse ".", "config.h" });
|
||||||
|
defer b.allocator.free(file);
|
||||||
|
const content = try std.fs.cwd().readFileAlloc(b.allocator, file, std.math.maxInt(usize));
|
||||||
|
defer b.allocator.free(content);
|
||||||
|
|
||||||
|
var lines = std.mem.splitScalar(u8, content, '\n');
|
||||||
|
while (lines.next()) |line| {
|
||||||
|
if (!std.mem.containsAtLeast(u8, line, 1, "SUPPORT")) continue;
|
||||||
|
if (std.mem.startsWith(u8, line, "//")) continue;
|
||||||
|
|
||||||
|
var flag = std.mem.trimLeft(u8, line, " \t"); // Trim whitespace
|
||||||
|
flag = flag["#define ".len - 1 ..]; // Remove #define
|
||||||
|
flag = std.mem.trimLeft(u8, flag, " \t"); // Trim whitespace
|
||||||
|
flag = flag[0..std.mem.indexOf(u8, flag, " ").?]; // Flag is only one word, so capture till space
|
||||||
|
flag = try std.fmt.allocPrint(b.allocator, "-D{s}", .{flag}); // Prepend with -D
|
||||||
|
|
||||||
|
// If user specifies the flag skip it
|
||||||
|
if (std.mem.containsAtLeast(u8, config, 1, flag)) continue;
|
||||||
|
|
||||||
|
// Append default value from config.h to compile flags
|
||||||
|
try raylib_flags_arr.append(b.allocator, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append config flags supplied by user to compile flags
|
||||||
|
try raylib_flags_arr.append(b.allocator, config);
|
||||||
|
|
||||||
|
try raylib_flags_arr.append(b.allocator, "-DEXTERNAL_CONFIG_FLAGS");
|
||||||
|
}
|
||||||
|
|
||||||
if (options.shared) {
|
if (options.shared) {
|
||||||
try raylib_flags_arr.appendSlice(b.allocator, shared_flags);
|
try raylib_flags_arr.appendSlice(b.allocator, shared_flags);
|
||||||
}
|
}
|
||||||
|
|
@ -117,31 +148,35 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
||||||
|
|
||||||
raylib.addLibraryPath(.{ .cwd_relative = "/usr/lib" });
|
raylib.addLibraryPath(.{ .cwd_relative = "/usr/lib" });
|
||||||
raylib.addIncludePath(.{ .cwd_relative = "/usr/include" });
|
raylib.addIncludePath(.{ .cwd_relative = "/usr/include" });
|
||||||
|
if (options.linux_display_backend == .X11 or options.linux_display_backend == .Both) {
|
||||||
switch (options.linux_display_backend) {
|
raylib.defineCMacro("_GLFW_X11", null);
|
||||||
.X11 => {
|
raylib.linkSystemLibrary("X11");
|
||||||
raylib.defineCMacro("_GLFW_X11", null);
|
|
||||||
raylib.linkSystemLibrary("X11");
|
|
||||||
},
|
|
||||||
.Wayland => {
|
|
||||||
raylib.defineCMacro("_GLFW_WAYLAND", null);
|
|
||||||
raylib.linkSystemLibrary("wayland-client");
|
|
||||||
raylib.linkSystemLibrary("wayland-cursor");
|
|
||||||
raylib.linkSystemLibrary("wayland-egl");
|
|
||||||
raylib.linkSystemLibrary("xkbcommon");
|
|
||||||
raylib.addIncludePath(b.path("src"));
|
|
||||||
waylandGenerate(b, raylib, "wayland.xml", "wayland-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "xdg-shell.xml", "xdg-shell-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "xdg-decoration-unstable-v1.xml", "xdg-decoration-unstable-v1-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "viewporter.xml", "viewporter-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "relative-pointer-unstable-v1.xml", "relative-pointer-unstable-v1-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "pointer-constraints-unstable-v1.xml", "pointer-constraints-unstable-v1-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "fractional-scale-v1.xml", "fractional-scale-v1-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "xdg-activation-v1.xml", "xdg-activation-v1-client-protocol");
|
|
||||||
waylandGenerate(b, raylib, "idle-inhibit-unstable-v1.xml", "idle-inhibit-unstable-v1-client-protocol");
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.linux_display_backend == .Wayland or options.linux_display_backend == .Both) {
|
||||||
|
_ = b.findProgram(&.{"wayland-scanner"}, &.{}) catch {
|
||||||
|
std.log.err(
|
||||||
|
\\ Wayland may not be installed on the system.
|
||||||
|
\\ You can switch to X11 in your `build.zig` by changing `Options.linux_display_backend`
|
||||||
|
, .{});
|
||||||
|
@panic("No Wayland");
|
||||||
|
};
|
||||||
|
raylib.defineCMacro("_GLFW_WAYLAND", null);
|
||||||
|
raylib.linkSystemLibrary("wayland-client");
|
||||||
|
raylib.linkSystemLibrary("wayland-cursor");
|
||||||
|
raylib.linkSystemLibrary("wayland-egl");
|
||||||
|
raylib.linkSystemLibrary("xkbcommon");
|
||||||
|
raylib.addIncludePath(b.path("src"));
|
||||||
|
waylandGenerate(b, raylib, "wayland.xml", "wayland-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "xdg-shell.xml", "xdg-shell-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "xdg-decoration-unstable-v1.xml", "xdg-decoration-unstable-v1-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "viewporter.xml", "viewporter-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "relative-pointer-unstable-v1.xml", "relative-pointer-unstable-v1-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "pointer-constraints-unstable-v1.xml", "pointer-constraints-unstable-v1-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "fractional-scale-v1.xml", "fractional-scale-v1-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "xdg-activation-v1.xml", "xdg-activation-v1-client-protocol");
|
||||||
|
waylandGenerate(b, raylib, "idle-inhibit-unstable-v1.xml", "idle-inhibit-unstable-v1-client-protocol");
|
||||||
|
}
|
||||||
raylib.defineCMacro("PLATFORM_DESKTOP", null);
|
raylib.defineCMacro("PLATFORM_DESKTOP", null);
|
||||||
} else {
|
} else {
|
||||||
if (options.opengl_version == .auto) {
|
if (options.opengl_version == .auto) {
|
||||||
|
|
@ -253,8 +288,9 @@ pub const Options = struct {
|
||||||
raygui: bool = false,
|
raygui: bool = false,
|
||||||
platform_drm: bool = false,
|
platform_drm: bool = false,
|
||||||
shared: bool = false,
|
shared: bool = false,
|
||||||
linux_display_backend: LinuxDisplayBackend = .X11,
|
linux_display_backend: LinuxDisplayBackend = .Both,
|
||||||
opengl_version: OpenglVersion = .auto,
|
opengl_version: OpenglVersion = .auto,
|
||||||
|
config: ?[]const u8 = null,
|
||||||
|
|
||||||
raygui_dependency_name: []const u8 = "raygui",
|
raygui_dependency_name: []const u8 = "raygui",
|
||||||
};
|
};
|
||||||
|
|
@ -284,6 +320,7 @@ pub const OpenglVersion = enum {
|
||||||
pub const LinuxDisplayBackend = enum {
|
pub const LinuxDisplayBackend = enum {
|
||||||
X11,
|
X11,
|
||||||
Wayland,
|
Wayland,
|
||||||
|
Both,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn build(b: *std.Build) !void {
|
pub fn build(b: *std.Build) !void {
|
||||||
|
|
@ -308,6 +345,7 @@ pub fn build(b: *std.Build) !void {
|
||||||
.shared = b.option(bool, "shared", "Compile as shared library") orelse defaults.shared,
|
.shared = b.option(bool, "shared", "Compile as shared library") orelse defaults.shared,
|
||||||
.linux_display_backend = b.option(LinuxDisplayBackend, "linux_display_backend", "Linux display backend to use") orelse defaults.linux_display_backend,
|
.linux_display_backend = b.option(LinuxDisplayBackend, "linux_display_backend", "Linux display backend to use") orelse defaults.linux_display_backend,
|
||||||
.opengl_version = b.option(OpenglVersion, "opengl_version", "OpenGL version to use") orelse defaults.opengl_version,
|
.opengl_version = b.option(OpenglVersion, "opengl_version", "OpenGL version to use") orelse defaults.opengl_version,
|
||||||
|
.config = b.option([]const u8, "config", "Compile with custom define macros overriding config.h") orelse null,
|
||||||
};
|
};
|
||||||
|
|
||||||
const lib = try compileRaylib(b, target, optimize, options);
|
const lib = try compileRaylib(b, target, optimize, options);
|
||||||
|
|
|
||||||
5455
src/external/RGFW.h
vendored
5455
src/external/RGFW.h
vendored
File diff suppressed because it is too large
Load Diff
10
src/external/jar_xm.h
vendored
10
src/external/jar_xm.h
vendored
|
|
@ -1204,7 +1204,7 @@ static void jar_xm_tone_portamento(jar_xm_context_t* ctx, jar_xm_channel_context
|
||||||
}
|
}
|
||||||
|
|
||||||
static void jar_xm_pitch_slide(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, float period_offset) {
|
static void jar_xm_pitch_slide(jar_xm_context_t* ctx, jar_xm_channel_context_t* ch, float period_offset) {
|
||||||
/* Don't ask about the 4.f coefficient. I found mention of it nowhere. Found by ear™. */
|
/* Don't ask about the 4.f coefficient. I found mention of it nowhere. Found by ear. */
|
||||||
if(ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES) {period_offset *= 4.f; }
|
if(ctx->module.frequency_type == jar_xm_LINEAR_FREQUENCIES) {period_offset *= 4.f; }
|
||||||
ch->period += period_offset;
|
ch->period += period_offset;
|
||||||
jar_xm_CLAMP_DOWN(ch->period);
|
jar_xm_CLAMP_DOWN(ch->period);
|
||||||
|
|
@ -1507,7 +1507,7 @@ static void jar_xm_handle_note_and_instrument(jar_xm_context_t* ctx, jar_xm_chan
|
||||||
jar_xm_volume_slide(ch, ch->fine_volume_slide_param);
|
jar_xm_volume_slide(ch, ch->fine_volume_slide_param);
|
||||||
break;
|
break;
|
||||||
case 0xD: /* EDy: Note delay */
|
case 0xD: /* EDy: Note delay */
|
||||||
/* XXX: figure this out better. EDx triggers the note even when there no note and no instrument. But ED0 acts like like a ghost note, EDx (x ≠ 0) does not. */
|
/* XXX: figure this out better. EDx triggers the note even when there no note and no instrument. But ED0 acts like like a ghost note, EDx (x != 0) does not. */
|
||||||
if(s->note == 0 && s->instrument == 0) {
|
if(s->note == 0 && s->instrument == 0) {
|
||||||
unsigned int flags = jar_xm_TRIGGER_KEEP_VOLUME;
|
unsigned int flags = jar_xm_TRIGGER_KEEP_VOLUME;
|
||||||
if(ch->current->effect_param & 0x0F) {
|
if(ch->current->effect_param & 0x0F) {
|
||||||
|
|
@ -1795,7 +1795,7 @@ static void jar_xm_tick(jar_xm_context_t* ctx) {
|
||||||
if(ch->current->effect_param > 0) {
|
if(ch->current->effect_param > 0) {
|
||||||
char arp_offset = ctx->tempo % 3;
|
char arp_offset = ctx->tempo % 3;
|
||||||
switch(arp_offset) {
|
switch(arp_offset) {
|
||||||
case 2: /* 0 -> x -> 0 -> y -> x -> … */
|
case 2: /* 0 -> x -> 0 -> y -> x -> ... */
|
||||||
if(ctx->current_tick == 1) {
|
if(ctx->current_tick == 1) {
|
||||||
ch->arp_in_progress = true;
|
ch->arp_in_progress = true;
|
||||||
ch->arp_note_offset = ch->current->effect_param >> 4;
|
ch->arp_note_offset = ch->current->effect_param >> 4;
|
||||||
|
|
@ -1803,7 +1803,7 @@ static void jar_xm_tick(jar_xm_context_t* ctx) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* No break here, this is intended */
|
/* No break here, this is intended */
|
||||||
case 1: /* 0 -> 0 -> y -> x -> … */
|
case 1: /* 0 -> 0 -> y -> x -> ... */
|
||||||
if(ctx->current_tick == 0) {
|
if(ctx->current_tick == 0) {
|
||||||
ch->arp_in_progress = false;
|
ch->arp_in_progress = false;
|
||||||
ch->arp_note_offset = 0;
|
ch->arp_note_offset = 0;
|
||||||
|
|
@ -1811,7 +1811,7 @@ static void jar_xm_tick(jar_xm_context_t* ctx) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* No break here, this is intended */
|
/* No break here, this is intended */
|
||||||
case 0: /* 0 -> y -> x -> … */
|
case 0: /* 0 -> y -> x -> ... */
|
||||||
jar_xm_arpeggio(ctx, ch, ch->current->effect_param, ctx->current_tick - arp_offset);
|
jar_xm_arpeggio(ctx, ch, ch->current->effect_param, ctx->current_tick - arp_offset);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
12
src/external/miniaudio.h
vendored
12
src/external/miniaudio.h
vendored
|
|
@ -21473,7 +21473,9 @@ static ma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device
|
||||||
MA_ASSERT(pContext != NULL);
|
MA_ASSERT(pContext != NULL);
|
||||||
MA_ASSERT(ppMMDevice != NULL);
|
MA_ASSERT(ppMMDevice != NULL);
|
||||||
|
|
||||||
|
ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE);
|
||||||
hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);
|
hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);
|
||||||
|
ma_CoUninitialize(pContext);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create IMMDeviceEnumerator.\n");
|
ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, "[WASAPI] Failed to create IMMDeviceEnumerator.\n");
|
||||||
return ma_result_from_HRESULT(hr);
|
return ma_result_from_HRESULT(hr);
|
||||||
|
|
@ -36076,9 +36078,15 @@ static ma_result ma_context_get_device_info_from_fd__audio4(ma_context* pContext
|
||||||
ma_uint32 channels;
|
ma_uint32 channels;
|
||||||
ma_uint32 sampleRate;
|
ma_uint32 sampleRate;
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
if (ioctl(fd, AUDIO_GETFORMAT, &fdInfo) < 0) {
|
||||||
|
return MA_ERROR;
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {
|
if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {
|
||||||
return MA_ERROR;
|
return MA_ERROR;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (deviceType == ma_device_type_playback) {
|
if (deviceType == ma_device_type_playback) {
|
||||||
channels = fdInfo.play.channels;
|
channels = fdInfo.play.channels;
|
||||||
|
|
@ -36356,7 +36364,11 @@ static ma_result ma_device_init_fd__audio4(ma_device* pDevice, const ma_device_c
|
||||||
/* We're using a default device. Get the info from the /dev/audioctl file instead of /dev/audio. */
|
/* We're using a default device. Get the info from the /dev/audioctl file instead of /dev/audio. */
|
||||||
int fdctl = open(pDefaultDeviceCtlNames[iDefaultDevice], fdFlags, 0);
|
int fdctl = open(pDefaultDeviceCtlNames[iDefaultDevice], fdFlags, 0);
|
||||||
if (fdctl != -1) {
|
if (fdctl != -1) {
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
fdInfoResult = ioctl(fdctl, AUDIO_GETFORMAT, &fdInfo);
|
||||||
|
#else
|
||||||
fdInfoResult = ioctl(fdctl, AUDIO_GETINFO, &fdInfo);
|
fdInfoResult = ioctl(fdctl, AUDIO_GETINFO, &fdInfo);
|
||||||
|
#endif
|
||||||
close(fdctl);
|
close(fdctl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -281,14 +281,15 @@ void android_main(struct android_app *app)
|
||||||
// Request to end the native activity
|
// Request to end the native activity
|
||||||
ANativeActivity_finish(app->activity);
|
ANativeActivity_finish(app->activity);
|
||||||
|
|
||||||
// Android ALooper_pollAll() variables
|
// Android ALooper_pollOnce() variables
|
||||||
int pollResult = 0;
|
int pollResult = 0;
|
||||||
int pollEvents = 0;
|
int pollEvents = 0;
|
||||||
|
|
||||||
// Waiting for application events before complete finishing
|
// Waiting for application events before complete finishing
|
||||||
while (!app->destroyRequested)
|
while (!app->destroyRequested)
|
||||||
{
|
{
|
||||||
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void **)&platform.source)) >= 0)
|
// Poll all events until we reach return value TIMEOUT, meaning no events left to process
|
||||||
|
while ((pollResult = ALooper_pollOnce(0, NULL, &pollEvents, (void **)&platform.source)) > ALOOPER_POLL_TIMEOUT)
|
||||||
{
|
{
|
||||||
if (platform.source != NULL) platform.source->process(app, platform.source);
|
if (platform.source != NULL) platform.source->process(app, platform.source);
|
||||||
}
|
}
|
||||||
|
|
@ -632,6 +633,13 @@ void SetMouseCursor(int cursor)
|
||||||
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "GetKeyName() not implemented on target platform");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
@ -675,13 +683,13 @@ void PollInputEvents(void)
|
||||||
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
CORE.Input.Keyboard.keyRepeatInFrame[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Android ALooper_pollAll() variables
|
// Android ALooper_pollOnce() variables
|
||||||
int pollResult = 0;
|
int pollResult = 0;
|
||||||
int pollEvents = 0;
|
int pollEvents = 0;
|
||||||
|
|
||||||
// Poll Events (registered events)
|
// Poll Events (registered events) until we reach TIMEOUT which indicates there are no events left to poll
|
||||||
// NOTE: Activity is paused if not enabled (platform.appEnabled)
|
// NOTE: Activity is paused if not enabled (platform.appEnabled)
|
||||||
while ((pollResult = ALooper_pollAll(platform.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&platform.source)) >= 0)
|
while ((pollResult = ALooper_pollOnce(platform.appEnabled? 0 : -1, NULL, &pollEvents, (void**)&platform.source)) > ALOOPER_POLL_TIMEOUT)
|
||||||
{
|
{
|
||||||
// Process this event
|
// Process this event
|
||||||
if (platform.source != NULL) platform.source->process(platform.app, platform.source);
|
if (platform.source != NULL) platform.source->process(platform.app, platform.source);
|
||||||
|
|
@ -760,15 +768,15 @@ int InitPlatform(void)
|
||||||
|
|
||||||
TRACELOG(LOG_INFO, "PLATFORM: ANDROID: Initialized successfully");
|
TRACELOG(LOG_INFO, "PLATFORM: ANDROID: Initialized successfully");
|
||||||
|
|
||||||
// Android ALooper_pollAll() variables
|
// Android ALooper_pollOnce() variables
|
||||||
int pollResult = 0;
|
int pollResult = 0;
|
||||||
int pollEvents = 0;
|
int pollEvents = 0;
|
||||||
|
|
||||||
// Wait for window to be initialized (display and context)
|
// Wait for window to be initialized (display and context)
|
||||||
while (!CORE.Window.ready)
|
while (!CORE.Window.ready)
|
||||||
{
|
{
|
||||||
// Process events loop
|
// Process events until we reach TIMEOUT, which indicates no more events queued.
|
||||||
while ((pollResult = ALooper_pollAll(0, NULL, &pollEvents, (void**)&platform.source)) >= 0)
|
while ((pollResult = ALooper_pollOnce(0, NULL, &pollEvents, (void**)&platform.source)) > ALOOPER_POLL_TIMEOUT)
|
||||||
{
|
{
|
||||||
// Process this event
|
// Process this event
|
||||||
if (platform.source != NULL) platform.source->process(platform.app, platform.source);
|
if (platform.source != NULL) platform.source->process(platform.app, platform.source);
|
||||||
|
|
|
||||||
|
|
@ -1075,6 +1075,12 @@ void SetMouseCursor(int cursor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
return glfwGetKeyName(key, glfwGetKeyScancode(key));
|
||||||
|
}
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
@ -1269,6 +1275,11 @@ int InitPlatform(void)
|
||||||
//glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); // OpenGL API to use. Alternative: GLFW_OPENGL_ES_API
|
//glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); // OpenGL API to use. Alternative: GLFW_OPENGL_ES_API
|
||||||
//glfwWindowHint(GLFW_AUX_BUFFERS, 0); // Number of auxiliar buffers
|
//glfwWindowHint(GLFW_AUX_BUFFERS, 0); // Number of auxiliar buffers
|
||||||
|
|
||||||
|
// Disable GlFW auto iconify behaviour
|
||||||
|
// Auto Iconify automatically minimizes (iconifies) the window if the window loses focus
|
||||||
|
// additionally auto iconify restores the hardware resolution of the monitor if the window that loses focus is a fullscreen window
|
||||||
|
glfwWindowHint(GLFW_AUTO_ICONIFY, 0);
|
||||||
|
|
||||||
// Check window creation flags
|
// Check window creation flags
|
||||||
if ((CORE.Window.flags & FLAG_FULLSCREEN_MODE) > 0) CORE.Window.fullscreen = true;
|
if ((CORE.Window.flags & FLAG_FULLSCREEN_MODE) > 0) CORE.Window.fullscreen = true;
|
||||||
|
|
||||||
|
|
@ -1448,11 +1459,6 @@ int InitPlatform(void)
|
||||||
// No-fullscreen window creation
|
// No-fullscreen window creation
|
||||||
bool requestWindowedFullscreen = (CORE.Window.screen.height == 0) && (CORE.Window.screen.width == 0);
|
bool requestWindowedFullscreen = (CORE.Window.screen.height == 0) && (CORE.Window.screen.width == 0);
|
||||||
|
|
||||||
// If we are windowed fullscreen, ensures that window does not minimize when focus is lost.
|
|
||||||
// This hinting code will not work if the user already specified the correct monitor dimensions;
|
|
||||||
// at this point we don't know the monitor's dimensions. (Though, how did the user then?)
|
|
||||||
if (requestWindowedFullscreen) glfwWindowHint(GLFW_AUTO_ICONIFY, 0);
|
|
||||||
|
|
||||||
// Default to at least one pixel in size, as creation with a zero dimension is not allowed.
|
// Default to at least one pixel in size, as creation with a zero dimension is not allowed.
|
||||||
int creationWidth = CORE.Window.screen.width != 0 ? CORE.Window.screen.width : 1;
|
int creationWidth = CORE.Window.screen.width != 0 ? CORE.Window.screen.width : 1;
|
||||||
int creationHeight = CORE.Window.screen.height != 0 ? CORE.Window.screen.height : 1;
|
int creationHeight = CORE.Window.screen.height != 0 ? CORE.Window.screen.height : 1;
|
||||||
|
|
@ -1624,16 +1630,16 @@ int InitPlatform(void)
|
||||||
char *glfwPlatform = "";
|
char *glfwPlatform = "";
|
||||||
switch (glfwGetPlatform())
|
switch (glfwGetPlatform())
|
||||||
{
|
{
|
||||||
case GLFW_PLATFORM_WIN32: glfwPlatform = "Win32"; break;
|
case GLFW_PLATFORM_WIN32: glfwPlatform = "Win32"; break;
|
||||||
case GLFW_PLATFORM_COCOA: glfwPlatform = "Cocoa"; break;
|
case GLFW_PLATFORM_COCOA: glfwPlatform = "Cocoa"; break;
|
||||||
case GLFW_PLATFORM_WAYLAND: glfwPlatform = "Wayland"; break;
|
case GLFW_PLATFORM_WAYLAND: glfwPlatform = "Wayland"; break;
|
||||||
case GLFW_PLATFORM_X11: glfwPlatform = "X11"; break;
|
case GLFW_PLATFORM_X11: glfwPlatform = "X11"; break;
|
||||||
case GLFW_PLATFORM_NULL: glfwPlatform = "Null"; break;
|
case GLFW_PLATFORM_NULL: glfwPlatform = "Null"; break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACELOG(LOG_INFO, "GLFW platform: %s", glfwPlatform);
|
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (GLFW - %s): Initialized successfully", glfwPlatform);
|
||||||
TRACELOG(LOG_INFO, "PLATFORM: DESKTOP (GLFW): Initialized successfully");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
*
|
*
|
||||||
**********************************************************************************************/
|
**********************************************************************************************/
|
||||||
|
|
||||||
#ifdef GRAPHICS_API_OPENGL_ES2
|
#if defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
#define RGFW_OPENGL_ES2
|
#define RGFW_OPENGL_ES2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -182,7 +182,7 @@ static const unsigned short keyMappingRGFW[] = {
|
||||||
[RGFW_u] = KEY_U,
|
[RGFW_u] = KEY_U,
|
||||||
[RGFW_v] = KEY_V,
|
[RGFW_v] = KEY_V,
|
||||||
[RGFW_w] = KEY_W,
|
[RGFW_w] = KEY_W,
|
||||||
[RGFW_x] KEY_X,
|
[RGFW_x] = KEY_X,
|
||||||
[RGFW_y] = KEY_Y,
|
[RGFW_y] = KEY_Y,
|
||||||
[RGFW_z] = KEY_Z,
|
[RGFW_z] = KEY_Z,
|
||||||
[RGFW_Bracket] = KEY_LEFT_BRACKET,
|
[RGFW_Bracket] = KEY_LEFT_BRACKET,
|
||||||
|
|
@ -483,14 +483,14 @@ void SetWindowIcons(Image *images, int count)
|
||||||
// Set title for window
|
// Set title for window
|
||||||
void SetWindowTitle(const char *title)
|
void SetWindowTitle(const char *title)
|
||||||
{
|
{
|
||||||
RGFW_window_setName(platform.window, title);
|
RGFW_window_setName(platform.window, (char*)title);
|
||||||
CORE.Window.title = title;
|
CORE.Window.title = title;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set window position on screen (windowed mode)
|
// Set window position on screen (windowed mode)
|
||||||
void SetWindowPosition(int x, int y)
|
void SetWindowPosition(int x, int y)
|
||||||
{
|
{
|
||||||
RGFW_window_move(platform.window, RGFW_VECTOR(x, y));
|
RGFW_window_move(platform.window, RGFW_POINT(x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set monitor for the current window
|
// Set monitor for the current window
|
||||||
|
|
@ -536,7 +536,9 @@ void SetWindowFocused(void)
|
||||||
// Get native window handle
|
// Get native window handle
|
||||||
void *GetWindowHandle(void)
|
void *GetWindowHandle(void)
|
||||||
{
|
{
|
||||||
#ifndef RGFW_WINDOWS
|
#ifdef RGFW_WEBASM
|
||||||
|
return (void*)platform.window->src.ctx;
|
||||||
|
#elif !defined(RGFW_WINDOWS)
|
||||||
return (void *)platform.window->src.window;
|
return (void *)platform.window->src.window;
|
||||||
#else
|
#else
|
||||||
return platform.window->src.hwnd;
|
return platform.window->src.hwnd;
|
||||||
|
|
@ -643,7 +645,7 @@ Vector2 GetWindowScaleDPI(void)
|
||||||
{
|
{
|
||||||
RGFW_monitor monitor = RGFW_window_getMonitor(platform.window);
|
RGFW_monitor monitor = RGFW_window_getMonitor(platform.window);
|
||||||
|
|
||||||
return (Vector2){((u32)monitor.scaleX)*platform.window->r.w, ((u32) monitor.scaleX)*platform.window->r.h};
|
return (Vector2){monitor.scaleX, monitor.scaleX};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set clipboard text content
|
// Set clipboard text content
|
||||||
|
|
@ -689,9 +691,8 @@ void EnableCursor(void)
|
||||||
void DisableCursor(void)
|
void DisableCursor(void)
|
||||||
{
|
{
|
||||||
RGFW_disableCursor = true;
|
RGFW_disableCursor = true;
|
||||||
|
|
||||||
// Set cursor position in the middle
|
RGFW_window_mouseHold(platform.window, RGFW_AREA(CORE.Window.screen.width / 2, CORE.Window.screen.height / 2));
|
||||||
SetMousePosition(CORE.Window.screen.width/2, CORE.Window.screen.height/2);
|
|
||||||
|
|
||||||
HideCursor();
|
HideCursor();
|
||||||
}
|
}
|
||||||
|
|
@ -745,7 +746,7 @@ int SetGamepadMappings(const char *mappings)
|
||||||
// Set mouse position XY
|
// Set mouse position XY
|
||||||
void SetMousePosition(int x, int y)
|
void SetMousePosition(int x, int y)
|
||||||
{
|
{
|
||||||
RGFW_window_moveMouse(platform.window, RGFW_VECTOR(x, y));
|
RGFW_window_moveMouse(platform.window, RGFW_POINT(x, y));
|
||||||
CORE.Input.Mouse.currentPosition = (Vector2){ (float)x, (float)y };
|
CORE.Input.Mouse.currentPosition = (Vector2){ (float)x, (float)y };
|
||||||
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
CORE.Input.Mouse.previousPosition = CORE.Input.Mouse.currentPosition;
|
||||||
}
|
}
|
||||||
|
|
@ -756,6 +757,13 @@ void SetMouseCursor(int cursor)
|
||||||
RGFW_window_setMouseStandard(platform.window, cursor);
|
RGFW_window_setMouseStandard(platform.window, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "GetKeyName() not implemented on target platform");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
static KeyboardKey ConvertScancodeToKey(u32 keycode);
|
static KeyboardKey ConvertScancodeToKey(u32 keycode);
|
||||||
|
|
||||||
// TODO: Review function to avoid duplicate with RSGL
|
// TODO: Review function to avoid duplicate with RSGL
|
||||||
|
|
@ -868,10 +876,10 @@ void PollInputEvents(void)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
CORE.Window.resizedLastFrame = false;
|
CORE.Window.resizedLastFrame = false;
|
||||||
|
|
||||||
#define RGFW_HOLD_MOUSE (1L<<2)
|
|
||||||
|
|
||||||
#if defined(RGFW_X11) //|| defined(RGFW_MACOS)
|
#define RGFW_HOLD_MOUSE (1L<<2)
|
||||||
if (platform.window->src.winArgs & RGFW_HOLD_MOUSE)
|
#if defined(RGFW_X11) //|| defined(RGFW_MACOS)
|
||||||
|
if (platform.window->_winArgs & RGFW_HOLD_MOUSE)
|
||||||
{
|
{
|
||||||
CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f };
|
CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f };
|
||||||
CORE.Input.Mouse.currentPosition = (Vector2){ 0.0f, 0.0f };
|
CORE.Input.Mouse.currentPosition = (Vector2){ 0.0f, 0.0f };
|
||||||
|
|
@ -1024,17 +1032,17 @@ void PollInputEvents(void)
|
||||||
} break;
|
} break;
|
||||||
case RGFW_mousePosChanged:
|
case RGFW_mousePosChanged:
|
||||||
{
|
{
|
||||||
if (platform.window->src.winArgs & RGFW_HOLD_MOUSE)
|
if (platform.window->_winArgs & RGFW_HOLD_MOUSE)
|
||||||
{
|
{
|
||||||
CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f };
|
CORE.Input.Mouse.previousPosition = (Vector2){ 0.0f, 0.0f };
|
||||||
|
|
||||||
if ((event->point.x - (platform.window->r.w/2))*2)
|
if (event->point.x)
|
||||||
CORE.Input.Mouse.previousPosition.x = CORE.Input.Mouse.currentPosition.x;
|
CORE.Input.Mouse.previousPosition.x = CORE.Input.Mouse.currentPosition.x;
|
||||||
if ((event->point.y - (platform.window->r.h/2))*2)
|
if (event->point.y)
|
||||||
CORE.Input.Mouse.previousPosition.y = CORE.Input.Mouse.currentPosition.y;
|
CORE.Input.Mouse.previousPosition.y = CORE.Input.Mouse.currentPosition.y;
|
||||||
|
|
||||||
CORE.Input.Mouse.currentPosition.x = (event->point.x - (platform.window->r.w/2))*2;
|
CORE.Input.Mouse.currentPosition.x = (float)event->point.x;
|
||||||
CORE.Input.Mouse.currentPosition.y = (event->point.y - (platform.window->r.h/2))*2;
|
CORE.Input.Mouse.currentPosition.y = (float)event->point.y;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1198,8 +1206,6 @@ void PollInputEvents(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RGFW_disableCursor && platform.window->event.inFocus) RGFW_window_mouseHold(platform.window, RGFW_AREA(0, 0));
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1233,15 +1239,15 @@ int InitPlatform(void)
|
||||||
// Check selection OpenGL version
|
// Check selection OpenGL version
|
||||||
if (rlGetVersion() == RL_OPENGL_21)
|
if (rlGetVersion() == RL_OPENGL_21)
|
||||||
{
|
{
|
||||||
RGFW_setGLVersion(2, 1);
|
RGFW_setGLVersion(RGFW_GL_CORE, 2, 1);
|
||||||
}
|
}
|
||||||
else if (rlGetVersion() == RL_OPENGL_33)
|
else if (rlGetVersion() == RL_OPENGL_33)
|
||||||
{
|
{
|
||||||
RGFW_setGLVersion(3, 3);
|
RGFW_setGLVersion(RGFW_GL_CORE, 3, 3);
|
||||||
}
|
}
|
||||||
else if (rlGetVersion() == RL_OPENGL_43)
|
else if (rlGetVersion() == RL_OPENGL_43)
|
||||||
{
|
{
|
||||||
RGFW_setGLVersion(4, 1);
|
RGFW_setGLVersion(RGFW_GL_CORE, 4, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CORE.Window.flags & FLAG_MSAA_4X_HINT)
|
if (CORE.Window.flags & FLAG_MSAA_4X_HINT)
|
||||||
|
|
@ -1251,6 +1257,16 @@ int InitPlatform(void)
|
||||||
|
|
||||||
platform.window = RGFW_createWindow(CORE.Window.title, RGFW_RECT(0, 0, CORE.Window.screen.width, CORE.Window.screen.height), flags);
|
platform.window = RGFW_createWindow(CORE.Window.title, RGFW_RECT(0, 0, CORE.Window.screen.width, CORE.Window.screen.height), flags);
|
||||||
|
|
||||||
|
RGFW_area screenSize = RGFW_getScreenSize();
|
||||||
|
CORE.Window.display.width = screenSize.w;
|
||||||
|
CORE.Window.display.height = screenSize.h;
|
||||||
|
/*
|
||||||
|
I think this is needed by Raylib now ?
|
||||||
|
If so, rcore_destkop_sdl should be updated too
|
||||||
|
*/
|
||||||
|
SetupFramebuffer(CORE.Window.display.width, CORE.Window.display.height);
|
||||||
|
|
||||||
|
|
||||||
if (CORE.Window.flags & FLAG_VSYNC_HINT) RGFW_window_swapInterval(platform.window, 1);
|
if (CORE.Window.flags & FLAG_VSYNC_HINT) RGFW_window_swapInterval(platform.window, 1);
|
||||||
|
|
||||||
RGFW_window_makeCurrent(platform.window);
|
RGFW_window_makeCurrent(platform.window);
|
||||||
|
|
|
||||||
|
|
@ -966,6 +966,12 @@ void SetMouseCursor(int cursor)
|
||||||
CORE.Input.Mouse.cursor = cursor;
|
CORE.Input.Mouse.cursor = cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
return SDL_GetKeyName(key);
|
||||||
|
}
|
||||||
|
|
||||||
static void UpdateTouchPointsSDL(SDL_TouchFingerEvent event)
|
static void UpdateTouchPointsSDL(SDL_TouchFingerEvent event)
|
||||||
{
|
{
|
||||||
CORE.Input.Touch.pointCount = SDL_GetNumTouchFingers(event.touchId);
|
CORE.Input.Touch.pointCount = SDL_GetNumTouchFingers(event.touchId);
|
||||||
|
|
|
||||||
|
|
@ -628,6 +628,13 @@ void SetMouseCursor(int cursor)
|
||||||
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "GetKeyName() not implemented on target platform");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -384,6 +384,13 @@ void SetMouseCursor(int cursor)
|
||||||
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
TRACELOG(LOG_WARNING, "SetMouseCursor() not implemented on target platform");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "GetKeyName() not implemented on target platform");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ static void CursorEnterCallback(GLFWwindow *window, int enter);
|
||||||
|
|
||||||
// Emscripten window callback events
|
// Emscripten window callback events
|
||||||
static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *event, void *userData);
|
static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *event, void *userData);
|
||||||
static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
|
// static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
|
||||||
static EM_BOOL EmscriptenResizeCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
|
static EM_BOOL EmscriptenResizeCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
|
||||||
|
|
||||||
// Emscripten input callback events
|
// Emscripten input callback events
|
||||||
|
|
@ -884,6 +884,13 @@ void SetMouseCursor(int cursor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get physical key name.
|
||||||
|
const char *GetKeyName(int key)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "GetKeyName() not implemented on target platform");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
// Register all input events
|
// Register all input events
|
||||||
void PollInputEvents(void)
|
void PollInputEvents(void)
|
||||||
{
|
{
|
||||||
|
|
@ -974,7 +981,7 @@ void PollInputEvents(void)
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button != -1) // Check for valid button
|
if (button + 1 != 0) // Check for valid button
|
||||||
{
|
{
|
||||||
if (gamepadState.digitalButton[j] == 1)
|
if (gamepadState.digitalButton[j] == 1)
|
||||||
{
|
{
|
||||||
|
|
@ -1565,12 +1572,12 @@ static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const Emscripte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register window resize event
|
// Register window resize event
|
||||||
static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData)
|
// static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData)
|
||||||
{
|
// {
|
||||||
// TODO: Implement EmscriptenWindowResizedCallback()?
|
// // TODO: Implement EmscriptenWindowResizedCallback()?
|
||||||
|
|
||||||
return 1; // The event was consumed by the callback handler
|
// return 1; // The event was consumed by the callback handler
|
||||||
}
|
// }
|
||||||
|
|
||||||
EM_JS(int, GetWindowInnerWidth, (), { return window.innerWidth; });
|
EM_JS(int, GetWindowInnerWidth, (), { return window.innerWidth; });
|
||||||
EM_JS(int, GetWindowInnerHeight, (), { return window.innerHeight; });
|
EM_JS(int, GetWindowInnerHeight, (), { return window.innerHeight; });
|
||||||
|
|
@ -1586,11 +1593,11 @@ static EM_BOOL EmscriptenResizeCallback(int eventType, const EmscriptenUiEvent *
|
||||||
int width = GetWindowInnerWidth();
|
int width = GetWindowInnerWidth();
|
||||||
int height = GetWindowInnerHeight();
|
int height = GetWindowInnerHeight();
|
||||||
|
|
||||||
if (width < CORE.Window.screenMin.width) width = CORE.Window.screenMin.width;
|
if (width < (int)CORE.Window.screenMin.width) width = CORE.Window.screenMin.width;
|
||||||
else if (width > CORE.Window.screenMax.width && CORE.Window.screenMax.width > 0) width = CORE.Window.screenMax.width;
|
else if (width > (int)CORE.Window.screenMax.width && CORE.Window.screenMax.width > 0) width = CORE.Window.screenMax.width;
|
||||||
|
|
||||||
if (height < CORE.Window.screenMin.height) height = CORE.Window.screenMin.height;
|
if (height < (int)CORE.Window.screenMin.height) height = CORE.Window.screenMin.height;
|
||||||
else if (height > CORE.Window.screenMax.height && CORE.Window.screenMax.height > 0) height = CORE.Window.screenMax.height;
|
else if (height > (int)CORE.Window.screenMax.height && CORE.Window.screenMax.height > 0) height = CORE.Window.screenMax.height;
|
||||||
|
|
||||||
emscripten_set_canvas_element_size("#canvas", width, height);
|
emscripten_set_canvas_element_size("#canvas", width, height);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1626,7 +1626,9 @@ Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data,
|
||||||
{
|
{
|
||||||
music.ctxType = MUSIC_AUDIO_FLAC;
|
music.ctxType = MUSIC_AUDIO_FLAC;
|
||||||
music.ctxData = ctxFlac;
|
music.ctxData = ctxFlac;
|
||||||
music.stream = LoadAudioStream(ctxFlac->sampleRate, ctxFlac->bitsPerSample, ctxFlac->channels);
|
int sampleSize = ctxFlac->bitsPerSample;
|
||||||
|
if (ctxFlac->bitsPerSample == 24) sampleSize = 16; // Forcing conversion to s16 on UpdateMusicStream()
|
||||||
|
music.stream = LoadAudioStream(ctxFlac->sampleRate, sampleSize, ctxFlac->channels);
|
||||||
music.frameCount = (unsigned int)ctxFlac->totalPCMFrameCount;
|
music.frameCount = (unsigned int)ctxFlac->totalPCMFrameCount;
|
||||||
music.looping = true; // Looping enabled by default
|
music.looping = true; // Looping enabled by default
|
||||||
musicLoaded = true;
|
musicLoaded = true;
|
||||||
|
|
|
||||||
12
src/raylib.h
12
src/raylib.h
|
|
@ -1,6 +1,6 @@
|
||||||
/**********************************************************************************************
|
/**********************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib v5.5 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
|
* raylib v5.5-dev - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com)
|
||||||
*
|
*
|
||||||
* FEATURES:
|
* FEATURES:
|
||||||
* - NO external dependencies, all required libraries included with raylib
|
* - NO external dependencies, all required libraries included with raylib
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
#define RAYLIB_VERSION_MAJOR 5
|
#define RAYLIB_VERSION_MAJOR 5
|
||||||
#define RAYLIB_VERSION_MINOR 5
|
#define RAYLIB_VERSION_MINOR 5
|
||||||
#define RAYLIB_VERSION_PATCH 0
|
#define RAYLIB_VERSION_PATCH 0
|
||||||
#define RAYLIB_VERSION "5.5"
|
#define RAYLIB_VERSION "5.5-dev"
|
||||||
|
|
||||||
// Function specifiers in case library is build/used as a shared library
|
// Function specifiers in case library is build/used as a shared library
|
||||||
// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
|
// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll
|
||||||
|
|
@ -1238,7 +1238,7 @@ RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color c
|
||||||
RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle
|
RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle
|
||||||
RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle
|
RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle
|
||||||
RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline
|
RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline
|
||||||
RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle
|
RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer); // Draw a gradient-filled circle
|
||||||
RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version)
|
RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version)
|
||||||
RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline
|
RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline
|
||||||
RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version)
|
RLAPI void DrawCircleLinesV(Vector2 center, float radius, Color color); // Draw circle outline (Vector version)
|
||||||
|
|
@ -1250,9 +1250,9 @@ RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color)
|
||||||
RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version)
|
RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version)
|
||||||
RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle
|
RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle
|
||||||
RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters
|
RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters
|
||||||
RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle
|
RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom); // Draw a vertical-gradient-filled rectangle
|
||||||
RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle
|
RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right); // Draw a horizontal-gradient-filled rectangle
|
||||||
RLAPI void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors
|
RLAPI void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight); // Draw a gradient-filled rectangle with custom vertex colors
|
||||||
RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline
|
RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline
|
||||||
RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters
|
RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters
|
||||||
RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges
|
RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges
|
||||||
|
|
|
||||||
|
|
@ -196,12 +196,12 @@ RLAPI Matrix GetCameraProjectionMatrix(Camera* camera, float aspect);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Defines and Macros
|
// Defines and Macros
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#define CAMERA_MOVE_SPEED 0.09f
|
#define CAMERA_MOVE_SPEED 5.4f // Units per second
|
||||||
#define CAMERA_ROTATION_SPEED 0.03f
|
#define CAMERA_ROTATION_SPEED 0.03f
|
||||||
#define CAMERA_PAN_SPEED 0.2f
|
#define CAMERA_PAN_SPEED 0.2f
|
||||||
|
|
||||||
// Camera mouse movement sensitivity
|
// Camera mouse movement sensitivity
|
||||||
#define CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f // TODO: it should be independant of framerate
|
#define CAMERA_MOUSE_MOVE_SENSITIVITY 0.003f
|
||||||
|
|
||||||
// Camera orbital speed in CAMERA_ORBITAL mode
|
// Camera orbital speed in CAMERA_ORBITAL mode
|
||||||
#define CAMERA_ORBITAL_SPEED 0.5f // Radians per second
|
#define CAMERA_ORBITAL_SPEED 0.5f // Radians per second
|
||||||
|
|
@ -481,10 +481,11 @@ void UpdateCamera(Camera *camera, int mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keyboard support
|
// Keyboard support
|
||||||
if (IsKeyDown(KEY_W)) CameraMoveForward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
float cameraMoveSpeed = CAMERA_MOVE_SPEED*GetFrameTime();
|
||||||
if (IsKeyDown(KEY_A)) CameraMoveRight(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (IsKeyDown(KEY_W)) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane);
|
||||||
if (IsKeyDown(KEY_S)) CameraMoveForward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (IsKeyDown(KEY_A)) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane);
|
||||||
if (IsKeyDown(KEY_D)) CameraMoveRight(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (IsKeyDown(KEY_S)) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane);
|
||||||
|
if (IsKeyDown(KEY_D)) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane);
|
||||||
|
|
||||||
// Gamepad movement
|
// Gamepad movement
|
||||||
if (IsGamepadAvailable(0))
|
if (IsGamepadAvailable(0))
|
||||||
|
|
@ -493,16 +494,16 @@ void UpdateCamera(Camera *camera, int mode)
|
||||||
CameraYaw(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_X)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget);
|
CameraYaw(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_X)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, rotateAroundTarget);
|
||||||
CameraPitch(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_Y)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp);
|
CameraPitch(camera, -(GetGamepadAxisMovement(0, GAMEPAD_AXIS_RIGHT_Y)*2)*CAMERA_MOUSE_MOVE_SENSITIVITY, lockView, rotateAroundTarget, rotateUp);
|
||||||
|
|
||||||
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) <= -0.25f) CameraMoveForward(camera, cameraMoveSpeed, moveInWorldPlane);
|
||||||
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) <= -0.25f) CameraMoveRight(camera, -cameraMoveSpeed, moveInWorldPlane);
|
||||||
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_Y) >= 0.25f) CameraMoveForward(camera, -cameraMoveSpeed, moveInWorldPlane);
|
||||||
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, CAMERA_MOVE_SPEED, moveInWorldPlane);
|
if (GetGamepadAxisMovement(0, GAMEPAD_AXIS_LEFT_X) >= 0.25f) CameraMoveRight(camera, cameraMoveSpeed, moveInWorldPlane);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == CAMERA_FREE)
|
if (mode == CAMERA_FREE)
|
||||||
{
|
{
|
||||||
if (IsKeyDown(KEY_SPACE)) CameraMoveUp(camera, CAMERA_MOVE_SPEED);
|
if (IsKeyDown(KEY_SPACE)) CameraMoveUp(camera, cameraMoveSpeed);
|
||||||
if (IsKeyDown(KEY_LEFT_CONTROL)) CameraMoveUp(camera, -CAMERA_MOVE_SPEED);
|
if (IsKeyDown(KEY_LEFT_CONTROL)) CameraMoveUp(camera, -cameraMoveSpeed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
38
src/rcore.c
38
src/rcore.c
|
|
@ -367,9 +367,9 @@ static int screenshotCounter = 0; // Screenshots counter
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SUPPORT_GIF_RECORDING)
|
#if defined(SUPPORT_GIF_RECORDING)
|
||||||
unsigned int gifFrameCounter = 0; // GIF frames counter
|
static unsigned int gifFrameCounter = 0; // GIF frames counter
|
||||||
bool gifRecording = false; // GIF recording state
|
static bool gifRecording = false; // GIF recording state
|
||||||
MsfGifState gifState = { 0 }; // MSGIF context state
|
static MsfGifState gifState = { 0 }; // MSGIF context state
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SUPPORT_AUTOMATION_EVENTS)
|
#if defined(SUPPORT_AUTOMATION_EVENTS)
|
||||||
|
|
@ -668,21 +668,14 @@ void InitWindow(int width, int height, const char *title)
|
||||||
SetShapesTexture(texture, (Rectangle){ 0.0f, 0.0f, 1.0f, 1.0f }); // WARNING: Module required: rshapes
|
SetShapesTexture(texture, (Rectangle){ 0.0f, 0.0f, 1.0f, 1.0f }); // WARNING: Module required: rshapes
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
|
|
||||||
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0)
|
|
||||||
{
|
|
||||||
// Set default font texture filter for HighDPI (blurry)
|
|
||||||
// RL_TEXTURE_FILTER_LINEAR - tex filter: BILINEAR, no mipmaps
|
|
||||||
rlTextureParameters(GetFontDefault().texture.id, RL_TEXTURE_MIN_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
|
||||||
rlTextureParameters(GetFontDefault().texture.id, RL_TEXTURE_MAG_FILTER, RL_TEXTURE_FILTER_LINEAR);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CORE.Time.frameCounter = 0;
|
CORE.Time.frameCounter = 0;
|
||||||
CORE.Window.shouldClose = false;
|
CORE.Window.shouldClose = false;
|
||||||
|
|
||||||
// Initialize random seed
|
// Initialize random seed
|
||||||
SetRandomSeed((unsigned int)time(NULL));
|
SetRandomSeed((unsigned int)time(NULL));
|
||||||
|
|
||||||
|
TRACELOG(LOG_INFO, "SYSTEM: Working Directory: %s", GetWorkingDirectory());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close window and unload OpenGL context
|
// Close window and unload OpenGL context
|
||||||
|
|
@ -2713,8 +2706,8 @@ void PlayAutomationEvent(AutomationEvent event)
|
||||||
} break;
|
} break;
|
||||||
case INPUT_MOUSE_WHEEL_MOTION: // param[0]: x delta, param[1]: y delta
|
case INPUT_MOUSE_WHEEL_MOTION: // param[0]: x delta, param[1]: y delta
|
||||||
{
|
{
|
||||||
CORE.Input.Mouse.currentWheelMove.x = (float)event.params[0]; break;
|
CORE.Input.Mouse.currentWheelMove.x = (float)event.params[0];
|
||||||
CORE.Input.Mouse.currentWheelMove.y = (float)event.params[1]; break;
|
CORE.Input.Mouse.currentWheelMove.y = (float)event.params[1];
|
||||||
} break;
|
} break;
|
||||||
case INPUT_TOUCH_UP: CORE.Input.Touch.currentTouchState[event.params[0]] = false; break; // param[0]: id
|
case INPUT_TOUCH_UP: CORE.Input.Touch.currentTouchState[event.params[0]] = false; break; // param[0]: id
|
||||||
case INPUT_TOUCH_DOWN: CORE.Input.Touch.currentTouchState[event.params[0]] = true; break; // param[0]: id
|
case INPUT_TOUCH_DOWN: CORE.Input.Touch.currentTouchState[event.params[0]] = true; break; // param[0]: id
|
||||||
|
|
@ -2751,6 +2744,8 @@ void PlayAutomationEvent(AutomationEvent event)
|
||||||
case ACTION_SETTARGETFPS: SetTargetFPS(event.params[0]); break;
|
case ACTION_SETTARGETFPS: SetTargetFPS(event.params[0]); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACELOG(LOG_INFO, "AUTOMATION PLAY: Frame: %i | Event type: %i | Event parameters: %i, %i, %i", event.frame, event.type, event.params[0], event.params[1], event.params[2]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
@ -2958,10 +2953,14 @@ int GetGamepadAxisCount(int gamepad)
|
||||||
// Get axis movement vector for a gamepad
|
// Get axis movement vector for a gamepad
|
||||||
float GetGamepadAxisMovement(int gamepad, int axis)
|
float GetGamepadAxisMovement(int gamepad, int axis)
|
||||||
{
|
{
|
||||||
float value = 0;
|
float value = (axis == GAMEPAD_AXIS_LEFT_TRIGGER || axis == GAMEPAD_AXIS_RIGHT_TRIGGER)? -1.0f : 0.0f;
|
||||||
|
|
||||||
if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (axis < MAX_GAMEPAD_AXIS) &&
|
if ((gamepad < MAX_GAMEPADS) && CORE.Input.Gamepad.ready[gamepad] && (axis < MAX_GAMEPAD_AXIS)) {
|
||||||
(fabsf(CORE.Input.Gamepad.axisState[gamepad][axis]) > 0.1f)) value = CORE.Input.Gamepad.axisState[gamepad][axis]; // 0.1f = GAMEPAD_AXIS_MINIMUM_DRIFT/DELTA
|
float movement = value < 0.0f ? CORE.Input.Gamepad.axisState[gamepad][axis] : fabsf(CORE.Input.Gamepad.axisState[gamepad][axis]);
|
||||||
|
|
||||||
|
// 0.1f = GAMEPAD_AXIS_MINIMUM_DRIFT/DELTA
|
||||||
|
if (movement > value + 0.1f) value = CORE.Input.Gamepad.axisState[gamepad][axis];
|
||||||
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
@ -3482,7 +3481,7 @@ static void RecordAutomationEvent(void)
|
||||||
currentEventList->events[currentEventList->count].frame = CORE.Time.frameCounter;
|
currentEventList->events[currentEventList->count].frame = CORE.Time.frameCounter;
|
||||||
currentEventList->events[currentEventList->count].type = INPUT_MOUSE_WHEEL_MOTION;
|
currentEventList->events[currentEventList->count].type = INPUT_MOUSE_WHEEL_MOTION;
|
||||||
currentEventList->events[currentEventList->count].params[0] = (int)CORE.Input.Mouse.currentWheelMove.x;
|
currentEventList->events[currentEventList->count].params[0] = (int)CORE.Input.Mouse.currentWheelMove.x;
|
||||||
currentEventList->events[currentEventList->count].params[1] = (int)CORE.Input.Mouse.currentWheelMove.y;;
|
currentEventList->events[currentEventList->count].params[1] = (int)CORE.Input.Mouse.currentWheelMove.y;
|
||||||
currentEventList->events[currentEventList->count].params[2] = 0;
|
currentEventList->events[currentEventList->count].params[2] = 0;
|
||||||
|
|
||||||
TRACELOG(LOG_INFO, "AUTOMATION: Frame: %i | Event type: INPUT_MOUSE_WHEEL_MOTION | Event parameters: %i, %i, %i", currentEventList->events[currentEventList->count].frame, currentEventList->events[currentEventList->count].params[0], currentEventList->events[currentEventList->count].params[1], currentEventList->events[currentEventList->count].params[2]);
|
TRACELOG(LOG_INFO, "AUTOMATION: Frame: %i | Event type: INPUT_MOUSE_WHEEL_MOTION | Event parameters: %i, %i, %i", currentEventList->events[currentEventList->count].frame, currentEventList->events[currentEventList->count].params[0], currentEventList->events[currentEventList->count].params[1], currentEventList->events[currentEventList->count].params[2]);
|
||||||
|
|
@ -3605,7 +3604,8 @@ static void RecordAutomationEvent(void)
|
||||||
for (int axis = 0; axis < MAX_GAMEPAD_AXIS; axis++)
|
for (int axis = 0; axis < MAX_GAMEPAD_AXIS; axis++)
|
||||||
{
|
{
|
||||||
// Event type: INPUT_GAMEPAD_AXIS_MOTION
|
// Event type: INPUT_GAMEPAD_AXIS_MOTION
|
||||||
if (CORE.Input.Gamepad.axisState[gamepad][axis] > 0.1f)
|
float defaultMovement = (axis == GAMEPAD_AXIS_LEFT_TRIGGER || axis == GAMEPAD_AXIS_RIGHT_TRIGGER)? -1.0f : 0.0f;
|
||||||
|
if (GetGamepadAxisMovement(gamepad, axis) != defaultMovement)
|
||||||
{
|
{
|
||||||
currentEventList->events[currentEventList->count].frame = CORE.Time.frameCounter;
|
currentEventList->events[currentEventList->count].frame = CORE.Time.frameCounter;
|
||||||
currentEventList->events[currentEventList->count].type = INPUT_GAMEPAD_AXIS_MOTION;
|
currentEventList->events[currentEventList->count].type = INPUT_GAMEPAD_AXIS_MOTION;
|
||||||
|
|
|
||||||
60
src/rlgl.h
60
src/rlgl.h
|
|
@ -3994,18 +3994,18 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
|
||||||
unsigned int fragmentShaderId = 0;
|
unsigned int fragmentShaderId = 0;
|
||||||
|
|
||||||
// Compile vertex shader (if provided)
|
// Compile vertex shader (if provided)
|
||||||
|
// NOTE: If not vertex shader is provided, use default one
|
||||||
if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER);
|
if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER);
|
||||||
// In case no vertex shader was provided or compilation failed, we use default vertex shader
|
else vertexShaderId = RLGL.State.defaultVShaderId;
|
||||||
if (vertexShaderId == 0) vertexShaderId = RLGL.State.defaultVShaderId;
|
|
||||||
|
|
||||||
// Compile fragment shader (if provided)
|
// Compile fragment shader (if provided)
|
||||||
|
// NOTE: If not vertex shader is provided, use default one
|
||||||
if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER);
|
if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER);
|
||||||
// In case no fragment shader was provided or compilation failed, we use default fragment shader
|
else fragmentShaderId = RLGL.State.defaultFShaderId;
|
||||||
if (fragmentShaderId == 0) fragmentShaderId = RLGL.State.defaultFShaderId;
|
|
||||||
|
|
||||||
// In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id
|
// In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id
|
||||||
if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId;
|
if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId;
|
||||||
else
|
else if ((vertexShaderId > 0) && (fragmentShaderId > 0))
|
||||||
{
|
{
|
||||||
// One of or both shader are new, we need to compile a new shader program
|
// One of or both shader are new, we need to compile a new shader program
|
||||||
id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId);
|
id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId);
|
||||||
|
|
@ -4083,6 +4083,8 @@ unsigned int rlCompileShader(const char *shaderCode, int type)
|
||||||
//case GL_GEOMETRY_SHADER:
|
//case GL_GEOMETRY_SHADER:
|
||||||
#if defined(GRAPHICS_API_OPENGL_43)
|
#if defined(GRAPHICS_API_OPENGL_43)
|
||||||
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break;
|
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Failed to compile compute shader code", shader); break;
|
||||||
|
#elif defined(GRAPHICS_API_OPENGL_33)
|
||||||
|
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break;
|
||||||
#endif
|
#endif
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
@ -4098,6 +4100,8 @@ unsigned int rlCompileShader(const char *shaderCode, int type)
|
||||||
TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log);
|
TRACELOG(RL_LOG_WARNING, "SHADER: [ID %i] Compile error: %s", shader, log);
|
||||||
RL_FREE(log);
|
RL_FREE(log);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shader = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -4108,6 +4112,8 @@ unsigned int rlCompileShader(const char *shaderCode, int type)
|
||||||
//case GL_GEOMETRY_SHADER:
|
//case GL_GEOMETRY_SHADER:
|
||||||
#if defined(GRAPHICS_API_OPENGL_43)
|
#if defined(GRAPHICS_API_OPENGL_43)
|
||||||
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break;
|
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader compiled successfully", shader); break;
|
||||||
|
#elif defined(GRAPHICS_API_OPENGL_33)
|
||||||
|
case GL_COMPUTE_SHADER: TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43", shader); break;
|
||||||
#endif
|
#endif
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
@ -4348,6 +4354,8 @@ unsigned int rlLoadComputeShaderProgram(unsigned int shaderId)
|
||||||
|
|
||||||
TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program);
|
TRACELOG(RL_LOG_INFO, "SHADER: [ID %i] Compute shader program loaded successfully", program);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
TRACELOG(RL_LOG_WARNING, "SHADER: Compute shaders not enabled. Define GRAPHICS_API_OPENGL_43");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return program;
|
return program;
|
||||||
|
|
@ -4372,6 +4380,8 @@ unsigned int rlLoadShaderBuffer(unsigned int size, const void *data, int usageHi
|
||||||
glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY);
|
glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, usageHint? usageHint : RL_STREAM_COPY);
|
||||||
if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0
|
if (data == NULL) glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL); // Clear buffer data to 0
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||||
|
#else
|
||||||
|
TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ssbo;
|
return ssbo;
|
||||||
|
|
@ -4382,7 +4392,10 @@ void rlUnloadShaderBuffer(unsigned int ssboId)
|
||||||
{
|
{
|
||||||
#if defined(GRAPHICS_API_OPENGL_43)
|
#if defined(GRAPHICS_API_OPENGL_43)
|
||||||
glDeleteBuffers(1, &ssboId);
|
glDeleteBuffers(1, &ssboId);
|
||||||
|
#else
|
||||||
|
TRACELOG(RL_LOG_WARNING, "SSBO: SSBO not enabled. Define GRAPHICS_API_OPENGL_43");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update SSBO buffer data
|
// Update SSBO buffer data
|
||||||
|
|
@ -4397,11 +4410,11 @@ void rlUpdateShaderBuffer(unsigned int id, const void *data, unsigned int dataSi
|
||||||
// Get SSBO buffer size
|
// Get SSBO buffer size
|
||||||
unsigned int rlGetShaderBufferSize(unsigned int id)
|
unsigned int rlGetShaderBufferSize(unsigned int id)
|
||||||
{
|
{
|
||||||
long long size = 0;
|
GLint64 size = 0;
|
||||||
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_43)
|
#if defined(GRAPHICS_API_OPENGL_43)
|
||||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
|
glBindBuffer(GL_SHADER_STORAGE_BUFFER, id);
|
||||||
glGetInteger64v(GL_SHADER_STORAGE_BUFFER_SIZE, &size);
|
glGetBufferParameteri64v(GL_SHADER_STORAGE_BUFFER, GL_BUFFER_SIZE, &size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return (size > 0)? (unsigned int)size : 0;
|
return (size > 0)? (unsigned int)size : 0;
|
||||||
|
|
@ -4442,6 +4455,8 @@ void rlBindImageTexture(unsigned int id, unsigned int index, int format, bool re
|
||||||
|
|
||||||
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
|
rlGetGlTextureFormats(format, &glInternalFormat, &glFormat, &glType);
|
||||||
glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat);
|
glBindImageTexture(index, id, 0, 0, 0, readonly? GL_READ_ONLY : GL_READ_WRITE, glInternalFormat);
|
||||||
|
#else
|
||||||
|
TRACELOG(RL_LOG_WARNING, "TEXTURE: Image texture binding not enabled. Define GRAPHICS_API_OPENGL_43");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4756,7 +4771,16 @@ static void rlLoadShaderDefault(void)
|
||||||
"out vec2 fragTexCoord; \n"
|
"out vec2 fragTexCoord; \n"
|
||||||
"out vec4 fragColor; \n"
|
"out vec4 fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
#if defined(GRAPHICS_API_OPENGL_ES2)
|
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES3)
|
||||||
|
"#version 300 es \n"
|
||||||
|
"precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2) (on some browsers)
|
||||||
|
"in vec3 vertexPosition; \n"
|
||||||
|
"in vec2 vertexTexCoord; \n"
|
||||||
|
"in vec4 vertexColor; \n"
|
||||||
|
"out vec2 fragTexCoord; \n"
|
||||||
|
"out vec4 fragColor; \n"
|
||||||
|
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
"#version 100 \n"
|
"#version 100 \n"
|
||||||
"precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers)
|
"precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL) (on some browsers)
|
||||||
"attribute vec3 vertexPosition; \n"
|
"attribute vec3 vertexPosition; \n"
|
||||||
|
|
@ -4765,6 +4789,7 @@ static void rlLoadShaderDefault(void)
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
"varying vec4 fragColor; \n"
|
"varying vec4 fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
"uniform mat4 mvp; \n"
|
"uniform mat4 mvp; \n"
|
||||||
"void main() \n"
|
"void main() \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
|
|
@ -4799,7 +4824,21 @@ static void rlLoadShaderDefault(void)
|
||||||
" finalColor = texelColor*colDiffuse*fragColor; \n"
|
" finalColor = texelColor*colDiffuse*fragColor; \n"
|
||||||
"} \n";
|
"} \n";
|
||||||
#endif
|
#endif
|
||||||
#if defined(GRAPHICS_API_OPENGL_ES2)
|
|
||||||
|
#if defined(GRAPHICS_API_OPENGL_ES3)
|
||||||
|
"#version 300 es \n"
|
||||||
|
"precision mediump float; \n" // Precision required for OpenGL ES3 (WebGL 2)
|
||||||
|
"in vec2 fragTexCoord; \n"
|
||||||
|
"in vec4 fragColor; \n"
|
||||||
|
"out vec4 finalColor; \n"
|
||||||
|
"uniform sampler2D texture0; \n"
|
||||||
|
"uniform vec4 colDiffuse; \n"
|
||||||
|
"void main() \n"
|
||||||
|
"{ \n"
|
||||||
|
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
||||||
|
" finalColor = texelColor*colDiffuse*fragColor; \n"
|
||||||
|
"} \n";
|
||||||
|
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
"#version 100 \n"
|
"#version 100 \n"
|
||||||
"precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL)
|
"precision mediump float; \n" // Precision required for OpenGL ES2 (WebGL)
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
|
|
@ -4969,7 +5008,8 @@ static int rlGetPixelDataSize(int width, int height, int format)
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dataSize = width*height*bpp/8; // Total data size in bytes
|
double bytesPerPixel = (double)bpp/8.0;
|
||||||
|
dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes
|
||||||
|
|
||||||
// Most compressed formats works on 4x4 blocks,
|
// Most compressed formats works on 4x4 blocks,
|
||||||
// if texture is smaller, minimum dataSize is 8 or 16
|
// if texture is smaller, minimum dataSize is 8 or 16
|
||||||
|
|
|
||||||
|
|
@ -4092,6 +4092,12 @@ static Model LoadOBJ(const char *fileName)
|
||||||
model.materialCount = 1;
|
model.materialCount = 1;
|
||||||
TRACELOG(LOG_INFO, "MODEL: No materials provided, setting one default material for all meshes");
|
TRACELOG(LOG_INFO, "MODEL: No materials provided, setting one default material for all meshes");
|
||||||
}
|
}
|
||||||
|
else if (model.materialCount > 1 && model.meshCount > 1)
|
||||||
|
{
|
||||||
|
// TEMP warning about multiple materials, to be removed when proper splitting code is implemented
|
||||||
|
// any obj with multiple materials will need to have it's materials assigned by the user in code to work at this time
|
||||||
|
TRACELOG(LOG_INFO, "MODEL: OBJ has multiple materials, manual material assignment will be required.");
|
||||||
|
}
|
||||||
|
|
||||||
// Init model meshes and materials
|
// Init model meshes and materials
|
||||||
model.meshes = (Mesh *)RL_CALLOC(model.meshCount, sizeof(Mesh));
|
model.meshes = (Mesh *)RL_CALLOC(model.meshCount, sizeof(Mesh));
|
||||||
|
|
@ -5741,11 +5747,11 @@ static bool GetPoseAtTimeGLTF(cgltf_interpolation_type interpolationType, cgltf_
|
||||||
cgltf_accessor_read_float(output, 3*keyframe+1, tmp, 4);
|
cgltf_accessor_read_float(output, 3*keyframe+1, tmp, 4);
|
||||||
Vector4 v1 = {tmp[0], tmp[1], tmp[2], tmp[3]};
|
Vector4 v1 = {tmp[0], tmp[1], tmp[2], tmp[3]};
|
||||||
cgltf_accessor_read_float(output, 3*keyframe+2, tmp, 4);
|
cgltf_accessor_read_float(output, 3*keyframe+2, tmp, 4);
|
||||||
Vector4 outTangent1 = {tmp[0], tmp[1], tmp[2]};
|
Vector4 outTangent1 = {tmp[0], tmp[1], tmp[2], 0.0f};
|
||||||
cgltf_accessor_read_float(output, 3*(keyframe+1)+1, tmp, 4);
|
cgltf_accessor_read_float(output, 3*(keyframe+1)+1, tmp, 4);
|
||||||
Vector4 v2 = {tmp[0], tmp[1], tmp[2], tmp[3]};
|
Vector4 v2 = {tmp[0], tmp[1], tmp[2], tmp[3]};
|
||||||
cgltf_accessor_read_float(output, 3*(keyframe+1), tmp, 4);
|
cgltf_accessor_read_float(output, 3*(keyframe+1), tmp, 4);
|
||||||
Vector4 inTangent2 = {tmp[0], tmp[1], tmp[2]};
|
Vector4 inTangent2 = {tmp[0], tmp[1], tmp[2], 0.0f};
|
||||||
Vector4 *r = data;
|
Vector4 *r = data;
|
||||||
|
|
||||||
v1 = QuaternionNormalize(v1);
|
v1 = QuaternionNormalize(v1);
|
||||||
|
|
|
||||||
|
|
@ -79,8 +79,8 @@
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Global Variables Definition
|
// Global Variables Definition
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
Texture2D texShapes = { 1, 1, 1, 1, 7 }; // Texture used on shapes drawing (white pixel loaded by rlgl)
|
static Texture2D texShapes = { 1, 1, 1, 1, 7 }; // Texture used on shapes drawing (white pixel loaded by rlgl)
|
||||||
Rectangle texShapesRec = { 0.0f, 0.0f, 1.0f, 1.0f }; // Texture source rectangle used on shapes drawing
|
static Rectangle texShapesRec = { 0.0f, 0.0f, 1.0f, 1.0f }; // Texture source rectangle used on shapes drawing
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module specific Functions Declaration
|
// Module specific Functions Declaration
|
||||||
|
|
@ -430,17 +430,16 @@ void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw a gradient-filled circle
|
// Draw a gradient-filled circle
|
||||||
// NOTE: Gradient goes from center (color1) to border (color2)
|
void DrawCircleGradient(int centerX, int centerY, float radius, Color inner, Color outer)
|
||||||
void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2)
|
|
||||||
{
|
{
|
||||||
rlBegin(RL_TRIANGLES);
|
rlBegin(RL_TRIANGLES);
|
||||||
for (int i = 0; i < 360; i += 10)
|
for (int i = 0; i < 360; i += 10)
|
||||||
{
|
{
|
||||||
rlColor4ub(color1.r, color1.g, color1.b, color1.a);
|
rlColor4ub(inner.r, inner.g, inner.b, inner.a);
|
||||||
rlVertex2f((float)centerX, (float)centerY);
|
rlVertex2f((float)centerX, (float)centerY);
|
||||||
rlColor4ub(color2.r, color2.g, color2.b, color2.a);
|
rlColor4ub(outer.r, outer.g, outer.b, outer.a);
|
||||||
rlVertex2f((float)centerX + cosf(DEG2RAD*(i + 10))*radius, (float)centerY + sinf(DEG2RAD*(i + 10))*radius);
|
rlVertex2f((float)centerX + cosf(DEG2RAD*(i + 10))*radius, (float)centerY + sinf(DEG2RAD*(i + 10))*radius);
|
||||||
rlColor4ub(color2.r, color2.g, color2.b, color2.a);
|
rlColor4ub(outer.r, outer.g, outer.b, outer.a);
|
||||||
rlVertex2f((float)centerX + cosf(DEG2RAD*i)*radius, (float)centerY + sinf(DEG2RAD*i)*radius);
|
rlVertex2f((float)centerX + cosf(DEG2RAD*i)*radius, (float)centerY + sinf(DEG2RAD*i)*radius);
|
||||||
}
|
}
|
||||||
rlEnd();
|
rlEnd();
|
||||||
|
|
@ -761,22 +760,19 @@ void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw a vertical-gradient-filled rectangle
|
// Draw a vertical-gradient-filled rectangle
|
||||||
// NOTE: Gradient goes from bottom (color1) to top (color2)
|
void DrawRectangleGradientV(int posX, int posY, int width, int height, Color top, Color bottom)
|
||||||
void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2)
|
|
||||||
{
|
{
|
||||||
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, color1, color2, color2, color1);
|
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, top, bottom, bottom, top);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw a horizontal-gradient-filled rectangle
|
// Draw a horizontal-gradient-filled rectangle
|
||||||
// NOTE: Gradient goes from bottom (color1) to top (color2)
|
void DrawRectangleGradientH(int posX, int posY, int width, int height, Color left, Color right)
|
||||||
void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2)
|
|
||||||
{
|
{
|
||||||
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, color1, color1, color2, color2);
|
DrawRectangleGradientEx((Rectangle){ (float)posX, (float)posY, (float)width, (float)height }, left, left, right, right);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw a gradient-filled rectangle
|
// Draw a gradient-filled rectangle
|
||||||
// NOTE: Colors refer to corners, starting at top-lef corner and counter-clockwise
|
void DrawRectangleGradientEx(Rectangle rec, Color topLeft, Color bottomLeft, Color topRight, Color bottomRight)
|
||||||
void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4)
|
|
||||||
{
|
{
|
||||||
rlSetTexture(GetShapesTexture().id);
|
rlSetTexture(GetShapesTexture().id);
|
||||||
Rectangle shapeRect = GetShapesTextureRectangle();
|
Rectangle shapeRect = GetShapesTextureRectangle();
|
||||||
|
|
@ -785,19 +781,19 @@ void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3,
|
||||||
rlNormal3f(0.0f, 0.0f, 1.0f);
|
rlNormal3f(0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
// NOTE: Default raylib font character 95 is a white square
|
// NOTE: Default raylib font character 95 is a white square
|
||||||
rlColor4ub(col1.r, col1.g, col1.b, col1.a);
|
rlColor4ub(topLeft.r, topLeft.g, topLeft.b, topLeft.a);
|
||||||
rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height);
|
rlTexCoord2f(shapeRect.x/texShapes.width, shapeRect.y/texShapes.height);
|
||||||
rlVertex2f(rec.x, rec.y);
|
rlVertex2f(rec.x, rec.y);
|
||||||
|
|
||||||
rlColor4ub(col2.r, col2.g, col2.b, col2.a);
|
rlColor4ub(bottomLeft.r, bottomLeft.g, bottomLeft.b, bottomLeft.a);
|
||||||
rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
|
rlTexCoord2f(shapeRect.x/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
|
||||||
rlVertex2f(rec.x, rec.y + rec.height);
|
rlVertex2f(rec.x, rec.y + rec.height);
|
||||||
|
|
||||||
rlColor4ub(col3.r, col3.g, col3.b, col3.a);
|
rlColor4ub(topRight.r, topRight.g, topRight.b, topRight.a);
|
||||||
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
|
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, (shapeRect.y + shapeRect.height)/texShapes.height);
|
||||||
rlVertex2f(rec.x + rec.width, rec.y + rec.height);
|
rlVertex2f(rec.x + rec.width, rec.y + rec.height);
|
||||||
|
|
||||||
rlColor4ub(col4.r, col4.g, col4.b, col4.a);
|
rlColor4ub(bottomRight.r, bottomRight.g, bottomRight.b, bottomRight.a);
|
||||||
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height);
|
rlTexCoord2f((shapeRect.x + shapeRect.width)/texShapes.width, shapeRect.y/texShapes.height);
|
||||||
rlVertex2f(rec.x + rec.width, rec.y);
|
rlVertex2f(rec.x + rec.width, rec.y);
|
||||||
rlEnd();
|
rlEnd();
|
||||||
|
|
|
||||||
|
|
@ -1467,8 +1467,7 @@ float TextToFloat(const char *text)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10.0f + (float)(text[i] - '0');
|
for (; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10.0f + (float)(text[i] - '0');
|
||||||
|
|
||||||
if (text[i++] != '.') value *= sign;
|
if (text[i++] == '.')
|
||||||
else
|
|
||||||
{
|
{
|
||||||
float divisor = 10.0f;
|
float divisor = 10.0f;
|
||||||
for (; ((text[i] >= '0') && (text[i] <= '9')); i++)
|
for (; ((text[i] >= '0') && (text[i] <= '9')); i++)
|
||||||
|
|
@ -1478,7 +1477,7 @@ float TextToFloat(const char *text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value*sign;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SUPPORT_TEXT_MANIPULATION)
|
#if defined(SUPPORT_TEXT_MANIPULATION)
|
||||||
|
|
|
||||||
|
|
@ -371,7 +371,7 @@ Image LoadImageSvg(const char *fileNameOrString, int width, int height)
|
||||||
|
|
||||||
if (isSvgStringValid)
|
if (isSvgStringValid)
|
||||||
{
|
{
|
||||||
struct NSVGimage *svgImage = nsvgParse(fileData, "px", 96.0f);
|
struct NSVGimage *svgImage = nsvgParse((char *)fileData, "px", 96.0f);
|
||||||
|
|
||||||
unsigned char *img = RL_MALLOC(width*height*4);
|
unsigned char *img = RL_MALLOC(width*height*4);
|
||||||
|
|
||||||
|
|
@ -404,7 +404,7 @@ Image LoadImageSvg(const char *fileNameOrString, int width, int height)
|
||||||
nsvgDeleteRasterizer(rast);
|
nsvgDeleteRasterizer(rast);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSvgStringValid && (fileData != fileNameOrString)) UnloadFileData(fileData);
|
if (isSvgStringValid && (fileData != (unsigned char *)fileNameOrString)) UnloadFileData(fileData);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
TRACELOG(LOG_WARNING, "SVG image support not enabled, image can not be loaded");
|
TRACELOG(LOG_WARNING, "SVG image support not enabled, image can not be loaded");
|
||||||
|
|
@ -503,7 +503,16 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
||||||
Image image = { 0 };
|
Image image = { 0 };
|
||||||
|
|
||||||
// Security check for input data
|
// Security check for input data
|
||||||
if ((fileType == NULL) || (fileData == NULL) || (dataSize == 0)) return image;
|
if ((fileData == NULL) || (dataSize == 0))
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "IMAGE: Invalid file data");
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
if (fileType == NULL)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "IMAGE: Missing file extension");
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
if ((false)
|
if ((false)
|
||||||
#if defined(SUPPORT_FILEFORMAT_PNG)
|
#if defined(SUPPORT_FILEFORMAT_PNG)
|
||||||
|
|
@ -602,7 +611,7 @@ Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, i
|
||||||
(fileData[2] == 'v') &&
|
(fileData[2] == 'v') &&
|
||||||
(fileData[3] == 'g'))
|
(fileData[3] == 'g'))
|
||||||
{
|
{
|
||||||
struct NSVGimage *svgImage = nsvgParse(fileData, "px", 96.0f);
|
struct NSVGimage *svgImage = nsvgParse((char *)fileData, "px", 96.0f);
|
||||||
unsigned char *img = RL_MALLOC(svgImage->width*svgImage->height*4);
|
unsigned char *img = RL_MALLOC(svgImage->width*svgImage->height*4);
|
||||||
|
|
||||||
// Rasterize
|
// Rasterize
|
||||||
|
|
@ -1103,6 +1112,7 @@ Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float
|
||||||
{
|
{
|
||||||
Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color));
|
Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color));
|
||||||
|
|
||||||
|
float aspectRatio = (float)width / (float)height;
|
||||||
for (int y = 0; y < height; y++)
|
for (int y = 0; y < height; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < width; x++)
|
for (int x = 0; x < width; x++)
|
||||||
|
|
@ -1110,6 +1120,10 @@ Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float
|
||||||
float nx = (float)(x + offsetX)*(scale/(float)width);
|
float nx = (float)(x + offsetX)*(scale/(float)width);
|
||||||
float ny = (float)(y + offsetY)*(scale/(float)height);
|
float ny = (float)(y + offsetY)*(scale/(float)height);
|
||||||
|
|
||||||
|
// Apply aspect ratio compensation to wider side
|
||||||
|
if (width > height) nx *= aspectRatio;
|
||||||
|
else ny /= aspectRatio;
|
||||||
|
|
||||||
// Basic perlin noise implementation (not used)
|
// Basic perlin noise implementation (not used)
|
||||||
//float p = (stb_perlin_noise3(nx, ny, 0.0f, 0, 0, 0);
|
//float p = (stb_perlin_noise3(nx, ny, 0.0f, 0, 0, 0);
|
||||||
|
|
||||||
|
|
@ -1213,6 +1227,7 @@ Image GenImageText(int width, int height, const char *text)
|
||||||
{
|
{
|
||||||
Image image = { 0 };
|
Image image = { 0 };
|
||||||
|
|
||||||
|
#if defined(SUPPORT_MODULE_RTEXT)
|
||||||
int textLength = TextLength(text);
|
int textLength = TextLength(text);
|
||||||
int imageViewSize = width*height;
|
int imageViewSize = width*height;
|
||||||
|
|
||||||
|
|
@ -1223,6 +1238,10 @@ Image GenImageText(int width, int height, const char *text)
|
||||||
image.mipmaps = 1;
|
image.mipmaps = 1;
|
||||||
|
|
||||||
memcpy(image.data, text, (textLength > imageViewSize)? imageViewSize : textLength);
|
memcpy(image.data, text, (textLength > imageViewSize)? imageViewSize : textLength);
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "IMAGE: GenImageText() requires module: rtext");
|
||||||
|
image = GenImageColor(width, height, BLACK); // Generating placeholder black image rectangle
|
||||||
|
#endif
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
@ -5389,7 +5408,8 @@ int GetPixelDataSize(int width, int height, int format)
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dataSize = width*height*bpp/8; // Total data size in bytes
|
double bytesPerPixel = (double)bpp/8.0;
|
||||||
|
dataSize = (int)(bytesPerPixel*width*height); // Total data size in bytes
|
||||||
|
|
||||||
// Most compressed formats works on 4x4 blocks,
|
// Most compressed formats works on 4x4 blocks,
|
||||||
// if texture is smaller, minimum dataSize is 8 or 16
|
// if texture is smaller, minimum dataSize is 8 or 16
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user