aboutsummaryrefslogtreecommitdiff
path: root/raylib/examples
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
commit2bbf92ad5ae7708bf18ac7ef333e9a979d8d1bde (patch)
treec9d22bb0d73d9cc0c8586e4d31c93a561ea8e910 /raylib/examples
parent1c0cc775732201f4c4d3ee0d6772be786b3b4aa1 (diff)
Working so hard like a soldiermain
Can't afford a thing on TV
Diffstat (limited to 'raylib/examples')
-rw-r--r--raylib/examples/Makefile223
-rw-r--r--raylib/examples/Makefile.Web603
-rw-r--r--raylib/examples/README.md9
-rw-r--r--raylib/examples/core/core_2d_camera.c2
-rw-r--r--raylib/examples/core/core_2d_camera_platformer.c2
-rw-r--r--raylib/examples/core/core_2d_camera_split_screen.c8
-rw-r--r--raylib/examples/core/core_3d_camera_free.c12
-rw-r--r--raylib/examples/core/core_3d_camera_free.pngbin25317 -> 25956 bytes
-rw-r--r--raylib/examples/core/core_automation_events.c334
-rw-r--r--raylib/examples/core/core_automation_events.pngbin0 -> 20515 bytes
-rw-r--r--raylib/examples/core/core_drop_files.c4
-rw-r--r--raylib/examples/core/core_input_gamepad_info.c45
-rw-r--r--raylib/examples/core/core_loading_thread.c2
-rw-r--r--raylib/examples/core/core_random_values.c2
-rw-r--r--raylib/examples/core/core_smooth_pixelperfect.c2
-rw-r--r--raylib/examples/core/core_storage_values.c4
-rw-r--r--raylib/examples/models/models_animation.c2
-rw-r--r--raylib/examples/models/models_loading_gltf.c2
-rw-r--r--raylib/examples/models/models_loading_m3d.c4
-rw-r--r--raylib/examples/models/models_mesh_generation.c2
-rw-r--r--raylib/examples/models/models_skybox.c13
-rw-r--r--raylib/examples/others/external/include/GLFW/glfw3.h1066
-rw-r--r--raylib/examples/others/external/include/GLFW/glfw3native.h222
-rw-r--r--raylib/examples/others/raymath_vector_angle.c2
-rw-r--r--raylib/examples/others/rlgl_standalone.c9
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs32
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/lighting.fs6
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/swirl.fs2
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl100/tiling.fs21
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl120/lighting.fs6
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs55
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs11
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs22
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs24
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs34
-rw-r--r--raylib/examples/shaders/resources/shaders/glsl330/lighting.fs6
-rw-r--r--raylib/examples/shaders/shader_texture_tiling.c94
-rw-r--r--raylib/examples/shaders/shaders_custom_uniform.c2
-rw-r--r--raylib/examples/shaders/shaders_deferred_render.c336
-rw-r--r--raylib/examples/shaders/shaders_deferred_render.pngbin0 -> 81327 bytes
-rw-r--r--raylib/examples/shaders/shaders_hybrid_render.c10
-rw-r--r--raylib/examples/shaders/shaders_julia_set.c96
-rw-r--r--raylib/examples/shaders/shaders_raymarching.c3
-rw-r--r--raylib/examples/shaders/shaders_texture_tiling.c105
-rw-r--r--raylib/examples/shaders/shaders_texture_tiling.pngbin0 -> 139191 bytes
-rw-r--r--raylib/examples/shaders/shaders_write_depth.c4
-rw-r--r--raylib/examples/shapes/raygui.h102
-rw-r--r--raylib/examples/shapes/shapes_bouncing_ball.c3
-rw-r--r--raylib/examples/shapes/shapes_draw_circle_sector.c2
-rw-r--r--raylib/examples/shapes/shapes_lines_bezier.c41
-rw-r--r--raylib/examples/shapes/shapes_lines_bezier.pngbin17537 -> 17953 bytes
-rw-r--r--raylib/examples/shapes/shapes_lines_splines.c155
-rw-r--r--raylib/examples/shapes/shapes_splines_drawing.c247
-rw-r--r--raylib/examples/shapes/shapes_splines_drawing.pngbin0 -> 26123 bytes
-rw-r--r--raylib/examples/shapes/shapes_top_down_lights.c1
-rw-r--r--raylib/examples/text/text_font_sdf.c2
-rw-r--r--raylib/examples/text/text_unicode.c18
-rw-r--r--raylib/examples/textures/textures_textured_curve.c154
58 files changed, 2817 insertions, 1351 deletions
diff --git a/raylib/examples/Makefile b/raylib/examples/Makefile
index 6031f05..5cd8e6b 100644
--- a/raylib/examples/Makefile
+++ b/raylib/examples/Makefile
@@ -1,6 +1,25 @@
#**************************************************************************************************
#
-# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5
+# raylib makefile for multiple platforms
+#
+# This file supports building raylib examples for the following platforms:
+#
+# > PLATFORM_DESKTOP (GLFW backend):
+# - Windows (Win32, Win64)
+# - Linux (X11/Wayland desktop mode)
+# - macOS/OSX (x64, arm64)
+# - FreeBSD, OpenBSD, NetBSD, DragonFly (X11 desktop)
+# > PLATFORM_DESKTOP_SDL (SDL backend):
+# - Windows (Win32, Win64)
+# - Linux (X11/Wayland desktop mode)
+# - Others (not tested)
+# > PLATFORM_WEB:
+# - HTML5 (WebAssembly)
+# > PLATFORM_DRM:
+# - Raspberry Pi 0-5 (DRM/KMS)
+# - Linux DRM subsystem (KMS mode)
+# > PLATFORM_ANDROID:
+# - Android (ARM, ARM64)
#
# Copyright (c) 2013-2023 Ramon Santamaria (@raysan5)
#
@@ -25,14 +44,17 @@
# Define required environment variables
#------------------------------------------------------------------------------------------------
-# Define target platform: PLATFORM_DESKTOP, PLATFORM_DRM, PLATFORM_ANDROID, PLATFORM_WEB
+# Define target platform: PLATFORM_DESKTOP, PLATFORM_DESKTOP_SDL, PLATFORM_DRM, PLATFORM_ANDROID, PLATFORM_WEB
PLATFORM ?= PLATFORM_DESKTOP
# Define required raylib variables
PROJECT_NAME ?= raylib_examples
-RAYLIB_VERSION ?= 4.5.0
+RAYLIB_VERSION ?= 5.0.0
RAYLIB_PATH ?= ..
+# Define raylib source code path
+RAYLIB_SRC_PATH ?= ../src
+
# Locations of raylib.h and libraylib.a/libraylib.so
# NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD
RAYLIB_INCLUDE_PATH ?= /usr/local/include
@@ -47,6 +69,11 @@ BUILD_MODE ?= RELEASE
# Use external GLFW library instead of rglfw module
USE_EXTERNAL_GLFW ?= FALSE
+# PLATFORM_DESKTOP_SDL: It requires SDL library to be provided externally
+# WARNING: Library is not included in raylib, it MUST be configured by users
+SDL_INCLUDE_PATH ?= $(RAYLIB_SRC_PATH)/external/SDL2-2.28.4/include
+SDL_LIBRARY_PATH ?= $(RAYLIB_SRC_PATH)/external/SDL2-2.28.4/lib/x64
+
# Use Wayland display server protocol on Linux desktop (by default it uses X11 windowing system)
# NOTE: This variable is only used for PLATFORM_OS: LINUX
USE_WAYLAND_DISPLAY ?= FALSE
@@ -58,8 +85,8 @@ BUILD_WEB_HEAP_SIZE ?= 134217728
BUILD_WEB_RESOURCES ?= TRUE
BUILD_WEB_RESOURCES_PATH ?= $(dir $<)resources@resources
-# Determine PLATFORM_OS in case PLATFORM_DESKTOP or PLATFORM_WEB selected
-ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_DESKTOP PLATFORM_WEB))
+# Determine PLATFORM_OS when required
+ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_DESKTOP PLATFORM_DESKTOP_SDL PLATFORM_WEB))
# No uname.exe on MinGW!, but OS=Windows_NT on Windows!
# ifeq ($(UNAME),Msys) -> Windows
ifeq ($(OS),Windows_NT)
@@ -156,7 +183,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID)
MAKE = mingw32-make
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
- MAKE = mingw32-make
+ MAKE = emmake make
endif
# Define compiler flags: CFLAGS
@@ -224,6 +251,9 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP)
INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH)
endif
endif
+ifeq ($(PLATFORM),PLATFORM_DESKTOP_SDL)
+ INCLUDE_PATHS += -I$(SDL_INCLUDE_PATH)
+endif
ifeq ($(PLATFORM),PLATFORM_DRM)
INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH)
INCLUDE_PATHS += -I/usr/include/libdrm
@@ -254,6 +284,17 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP)
LDFLAGS += -Lsrc -L$(RAYLIB_LIB_PATH)
endif
endif
+ifeq ($(PLATFORM),PLATFORM_DESKTOP_SDL)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ # NOTE: The resource .rc file contains windows executable icon and properties
+ LDFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data
+ # -Wl,--subsystem,windows hides the console window
+ ifeq ($(BUILD_MODE), RELEASE)
+ LDFLAGS += -Wl,--subsystem,windows
+ endif
+ endif
+ LDFLAGS += -L$(SDL_LIBRARY_PATH)
+endif
ifeq ($(PLATFORM),PLATFORM_WEB)
# -Os # size optimization
# -O2 # optimization level 2, if used, also set --memory-init-file 0
@@ -346,6 +387,34 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP)
LDLIBS += -lglfw
endif
endif
+ifeq ($(PLATFORM),PLATFORM_DESKTOP_SDL)
+ ifeq ($(PLATFORM_OS),WINDOWS)
+ # Libraries for Windows desktop compilation
+ LDLIBS = -lraylib -lSDL2 -lSDL2main -lopengl32 -lgdi32
+ endif
+ ifeq ($(PLATFORM_OS),LINUX)
+ # Libraries for Debian GNU/Linux desktop compiling
+ # NOTE: Required packages: libegl1-mesa-dev
+ LDLIBS = -lraylib -lSDL2 -lSDL2main -lGL -lm -lpthread -ldl -lrt
+
+ # On X11 requires also below libraries
+ LDLIBS += -lX11
+ # NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
+ #LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
+
+ # On Wayland windowing system, additional libraries requires
+ ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
+ LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
+ endif
+ # Explicit link to libc
+ ifeq ($(RAYLIB_LIBTYPE),SHARED)
+ LDLIBS += -lc
+ endif
+
+ # NOTE: On ARM 32bit arch, miniaudio requires atomics library
+ LDLIBS += -latomic
+ endif
+endif
ifeq ($(PLATFORM),PLATFORM_DRM)
# Libraries for DRM compiling
# NOTE: Required packages: libasound2-dev (ALSA)
@@ -359,97 +428,99 @@ endif
# Define source code object files required
#------------------------------------------------------------------------------------------------
CORE = \
- core/core_basic_window \
- core/core_basic_screen_manager \
- core/core_input_keys \
- core/core_input_mouse \
- core/core_input_mouse_wheel \
- core/core_input_gamepad \
- core/core_input_gamepad_info \
- core/core_input_multitouch \
- core/core_input_gestures \
- core/core_input_gestures_web \
core/core_2d_camera \
- core/core_2d_camera_platformer \
core/core_2d_camera_mouse_zoom \
+ core/core_2d_camera_platformer \
core/core_2d_camera_split_screen \
- core/core_3d_camera_mode \
- core/core_3d_camera_free \
core/core_3d_camera_first_person \
+ core/core_3d_camera_free \
+ core/core_3d_camera_mode \
core/core_3d_camera_split_screen \
core/core_3d_picking \
- core/core_world_screen \
+ core/core_automation_events \
+ core/core_basic_screen_manager \
+ core/core_basic_window \
+ core/core_custom_frame_control \
core/core_custom_logging \
core/core_drop_files \
+ core/core_input_gamepad \
+ core/core_input_gamepad_info \
+ core/core_input_gestures \
+ core/core_input_gestures_web \
+ core/core_input_keys \
+ core/core_input_mouse \
+ core/core_input_mouse_wheel \
+ core/core_input_multitouch \
+ core/core_loading_thread \
core/core_random_values \
core/core_scissor_test \
+ core/core_smooth_pixelperfect \
core/core_storage_values \
core/core_vr_simulator \
- core/core_loading_thread \
core/core_window_flags \
core/core_window_letterbox \
core/core_window_should_close \
- core/core_smooth_pixelperfect \
- core/core_custom_frame_control
+ core/core_world_screen
SHAPES = \
shapes/shapes_basic_shapes \
shapes/shapes_bouncing_ball \
- shapes/shapes_colors_palette \
- shapes/shapes_logo_raylib \
- shapes/shapes_logo_raylib_anim \
- shapes/shapes_rectangle_scaling \
- shapes/shapes_lines_bezier \
shapes/shapes_collision_area \
- shapes/shapes_following_eyes \
+ shapes/shapes_colors_palette \
+ shapes/shapes_draw_circle_sector \
+ shapes/shapes_draw_rectangle_rounded \
+ shapes/shapes_draw_ring \
shapes/shapes_easings_ball_anim \
shapes/shapes_easings_box_anim \
shapes/shapes_easings_rectangle_array \
- shapes/shapes_draw_ring \
- shapes/shapes_draw_circle_sector \
- shapes/shapes_draw_rectangle_rounded \
+ shapes/shapes_following_eyes \
+ shapes/shapes_lines_bezier \
+ shapes/shapes_logo_raylib \
+ shapes/shapes_logo_raylib_anim \
+ shapes/shapes_rectangle_scaling \
+ shapes/shapes_splines_drawing \
shapes/shapes_top_down_lights
TEXTURES = \
- textures/textures_logo_raylib \
- textures/textures_mouse_painting \
- textures/textures_srcrec_dstrec \
+ textures/textures_background_scrolling \
+ textures/textures_blend_modes \
+ textures/textures_bunnymark \
+ textures/textures_draw_tiled \
+ textures/textures_fog_of_war \
+ textures/textures_gif_player \
textures/textures_image_drawing \
textures/textures_image_generation \
textures/textures_image_loading \
textures/textures_image_processing \
textures/textures_image_rotate \
textures/textures_image_text \
- textures/textures_to_image \
- textures/textures_raw_data \
- textures/textures_particles_blending \
+ textures/textures_logo_raylib \
+ textures/textures_mouse_painting \
textures/textures_npatch_drawing \
- textures/textures_background_scrolling \
+ textures/textures_particles_blending \
+ textures/textures_polygon \
+ textures/textures_raw_data \
textures/textures_sprite_anim \
textures/textures_sprite_button \
textures/textures_sprite_explosion \
+ textures/textures_srcrec_dstrec \
+ textures/textures_svg_loading \
textures/textures_textured_curve \
- textures/textures_bunnymark \
- textures/textures_blend_modes \
- textures/textures_draw_tiled \
- textures/textures_polygon \
- textures/textures_gif_player \
- textures/textures_fog_of_war \
- textures/textures_svg_loading
+ textures/textures_to_image
TEXT = \
- text/text_raylib_fonts \
- text/text_font_spritefont \
- text/text_font_loading \
+ text/text_codepoints_loading \
+ text/text_draw_3d \
text/text_font_filters \
+ text/text_font_loading \
text/text_font_sdf \
+ text/text_font_spritefont \
text/text_format_text \
text/text_input_box \
- text/text_writing_anim \
+ text/text_raylib_fonts \
text/text_rectangle_bounds \
text/text_unicode \
- text/text_draw_3d \
- text/text_codepoints_loading
+ text/text_writing_anim
MODELS = \
models/models_animation \
@@ -459,50 +530,52 @@ MODELS = \
models/models_draw_cube_texture \
models/models_first_person_maze \
models/models_geometric_shapes \
- models/models_mesh_generation \
- models/models_mesh_picking \
+ models/models_heightmap \
models/models_loading \
- models/models_loading_vox \
models/models_loading_gltf \
models/models_loading_m3d \
+ models/models_loading_vox \
+ models/models_mesh_generation \
+ models/models_mesh_picking \
models/models_orthographic_projection \
models/models_rlgl_solar_system \
models/models_skybox \
- models/models_yaw_pitch_roll \
- models/models_heightmap \
- models/models_waving_cubes
+ models/models_waving_cubes \
+ models/models_yaw_pitch_roll
SHADERS = \
- shaders/shaders_model_shader \
- shaders/shaders_shapes_textures \
+ shaders/shaders_basic_lighting \
shaders/shaders_custom_uniform \
- shaders/shaders_postprocessing \
- shaders/shaders_palette_switch \
- shaders/shaders_raymarching \
- shaders/shaders_texture_drawing \
- shaders/shaders_texture_waves \
- shaders/shaders_texture_outline \
- shaders/shaders_julia_set \
+ shaders/shaders_deferred_render \
shaders/shaders_eratosthenes \
- shaders/shaders_basic_lighting \
shaders/shaders_fog \
- shaders/shaders_simple_mask \
- shaders/shaders_spotlight \
shaders/shaders_hot_reloading \
+ shaders/shaders_hybrid_render \
+ shaders/shaders_julia_set \
shaders/shaders_lightmap \
shaders/shaders_mesh_instancing \
+ shaders/shaders_model_shader \
shaders/shaders_multi_sample2d \
- shaders/shaders_write_depth \
- shaders/shaders_hybrid_render
+ shaders/shaders_palette_switch \
+ shaders/shaders_postprocessing \
+ shaders/shaders_raymarching \
+ shaders/shaders_shapes_textures \
+ shaders/shaders_simple_mask \
+ shaders/shaders_spotlight \
+ shaders/shaders_texture_drawing \
+ shaders/shaders_texture_outline \
+ shaders/shaders_texture_tiling \
+ shaders/shaders_texture_waves \
+ shaders/shaders_write_depth
AUDIO = \
+ audio/audio_mixed_processor \
audio/audio_module_playing \
audio/audio_music_stream \
audio/audio_raw_stream \
audio/audio_sound_loading \
audio/audio_sound_multi \
- audio/audio_stream_effects \
- audio/audio_mixed_processor
+ audio/audio_stream_effects
OTHERS = \
others/easings_testbed \
@@ -533,6 +606,8 @@ others: $(OTHERS)
%: %.c
ifeq ($(PLATFORM),PLATFORM_ANDROID)
$(MAKE) -f Makefile.Android PROJECT_NAME=$@ PROJECT_SOURCE_FILES=$<
+else ifeq ($(PLATFORM),PLATFORM_WEB)
+ $(MAKE) -f Makefile.Web $@
else
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
endif
diff --git a/raylib/examples/Makefile.Web b/raylib/examples/Makefile.Web
index 267e023..e8a7266 100644
--- a/raylib/examples/Makefile.Web
+++ b/raylib/examples/Makefile.Web
@@ -30,7 +30,7 @@ PLATFORM ?= PLATFORM_WEB
# Define required raylib variables
PROJECT_NAME ?= raylib_examples
-RAYLIB_VERSION ?= 4.5.0
+RAYLIB_VERSION ?= 5.0.0
RAYLIB_PATH ?= ..
# Locations of raylib.h and libraylib.a/libraylib.so
@@ -138,7 +138,7 @@ endif
# Define default make program: MAKE
#------------------------------------------------------------------------------------------------
-MAKE ?= make
+MAKE ?= emmake make
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
ifeq ($(PLATFORM_OS),WINDOWS)
@@ -149,7 +149,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID)
MAKE = mingw32-make
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
- MAKE = mingw32-make
+ MAKE = emmake make
endif
# Define compiler flags: CFLAGS
@@ -334,95 +334,99 @@ endif
# Define source code object files required
#------------------------------------------------------------------------------------------------
CORE = \
- core/core_basic_window \
- core/core_basic_screen_manager \
- core/core_input_keys \
- core/core_input_mouse \
- core/core_input_mouse_wheel \
- core/core_input_gamepad \
- core/core_input_multitouch \
- core/core_input_gestures \
- core/core_input_gestures_web \
core/core_2d_camera \
- core/core_2d_camera_platformer \
core/core_2d_camera_mouse_zoom \
+ core/core_2d_camera_platformer \
core/core_2d_camera_split_screen \
- core/core_3d_camera_mode \
- core/core_3d_camera_free \
core/core_3d_camera_first_person \
+ core/core_3d_camera_free \
+ core/core_3d_camera_mode \
core/core_3d_camera_split_screen \
core/core_3d_picking \
- core/core_world_screen \
+ core/core_automation_events \
+ core/core_basic_screen_manager \
+ core/core_basic_window \
+ core/core_custom_frame_control \
core/core_custom_logging \
core/core_drop_files \
+ core/core_input_gamepad \
+ core/core_input_gamepad_info \
+ core/core_input_gestures \
+ core/core_input_gestures_web \
+ core/core_input_keys \
+ core/core_input_mouse \
+ core/core_input_mouse_wheel \
+ core/core_input_multitouch \
+ core/core_loading_thread \
core/core_random_values \
core/core_scissor_test \
+ core/core_smooth_pixelperfect \
core/core_storage_values \
core/core_vr_simulator \
core/core_window_flags \
core/core_window_letterbox \
core/core_window_should_close \
- core/core_smooth_pixelperfect \
- core/core_custom_frame_control \
- core/core_loading_thread
+ core/core_world_screen
SHAPES = \
shapes/shapes_basic_shapes \
shapes/shapes_bouncing_ball \
- shapes/shapes_colors_palette \
- shapes/shapes_logo_raylib \
- shapes/shapes_logo_raylib_anim \
- shapes/shapes_rectangle_scaling \
- shapes/shapes_lines_bezier \
shapes/shapes_collision_area \
- shapes/shapes_following_eyes \
+ shapes/shapes_colors_palette \
+ shapes/shapes_draw_circle_sector \
+ shapes/shapes_draw_rectangle_rounded \
+ shapes/shapes_draw_ring \
shapes/shapes_easings_ball_anim \
shapes/shapes_easings_box_anim \
shapes/shapes_easings_rectangle_array \
- shapes/shapes_draw_ring \
- shapes/shapes_draw_circle_sector \
- shapes/shapes_draw_rectangle_rounded \
+ shapes/shapes_following_eyes \
+ shapes/shapes_lines_bezier \
+ shapes/shapes_logo_raylib \
+ shapes/shapes_logo_raylib_anim \
+ shapes/shapes_rectangle_scaling \
+ shapes/shapes_splines_drawing \
shapes/shapes_top_down_lights
TEXTURES = \
- textures/textures_logo_raylib \
- textures/textures_mouse_painting \
- textures/textures_srcrec_dstrec \
+ textures/textures_background_scrolling \
+ textures/textures_blend_modes \
+ textures/textures_bunnymark \
+ textures/textures_draw_tiled \
+ textures/textures_fog_of_war \
+ textures/textures_gif_player \
textures/textures_image_drawing \
textures/textures_image_generation \
textures/textures_image_loading \
textures/textures_image_processing \
+ textures/textures_image_rotate \
textures/textures_image_text \
- textures/textures_to_image \
- textures/textures_raw_data \
- textures/textures_particles_blending \
+ textures/textures_logo_raylib \
+ textures/textures_mouse_painting \
textures/textures_npatch_drawing \
- textures/textures_background_scrolling \
+ textures/textures_particles_blending \
+ textures/textures_polygon \
+ textures/textures_raw_data \
textures/textures_sprite_anim \
textures/textures_sprite_button \
textures/textures_sprite_explosion \
+ textures/textures_srcrec_dstrec \
+ textures/textures_svg_loading \
textures/textures_textured_curve \
- textures/textures_bunnymark \
- textures/textures_blend_modes \
- textures/textures_draw_tiled \
- textures/textures_polygon \
- textures/textures_gif_player \
- textures/textures_fog_of_war \
- textures/textures_svg_loading
+ textures/textures_to_image
TEXT = \
- text/text_raylib_fonts \
- text/text_font_spritefont \
- text/text_font_loading \
+ text/text_codepoints_loading \
+ text/text_draw_3d \
text/text_font_filters \
+ text/text_font_loading \
text/text_font_sdf \
+ text/text_font_spritefont \
text/text_format_text \
text/text_input_box \
- text/text_writing_anim \
+ text/text_raylib_fonts \
text/text_rectangle_bounds \
text/text_unicode \
- text/text_draw_3d \
- text/text_codepoints_loading
+ text/text_writing_anim
MODELS = \
models/models_animation \
@@ -432,49 +436,60 @@ MODELS = \
models/models_draw_cube_texture \
models/models_first_person_maze \
models/models_geometric_shapes \
- models/models_mesh_generation \
- models/models_mesh_picking \
+ models/models_heightmap \
models/models_loading \
- models/models_loading_vox \
models/models_loading_gltf \
models/models_loading_m3d \
+ models/models_loading_vox \
+ models/models_mesh_generation \
+ models/models_mesh_picking \
models/models_orthographic_projection \
models/models_rlgl_solar_system \
models/models_skybox \
- models/models_yaw_pitch_roll \
- models/models_heightmap \
- models/models_waving_cubes
+ models/models_waving_cubes \
+ models/models_yaw_pitch_roll
SHADERS = \
- shaders/shaders_model_shader \
- shaders/shaders_shapes_textures \
+ shaders/shaders_basic_lighting \
shaders/shaders_custom_uniform \
- shaders/shaders_postprocessing \
- shaders/shaders_palette_switch \
- shaders/shaders_raymarching \
- shaders/shaders_texture_drawing \
- shaders/shaders_texture_waves \
- shaders/shaders_texture_outline \
- shaders/shaders_julia_set \
+ shaders/shaders_deferred_render \
shaders/shaders_eratosthenes \
- shaders/shaders_basic_lighting \
shaders/shaders_fog \
- shaders/shaders_simple_mask \
- shaders/shaders_spotlight \
shaders/shaders_hot_reloading \
+ shaders/shaders_hybrid_render \
+ shaders/shaders_julia_set \
shaders/shaders_lightmap \
shaders/shaders_mesh_instancing \
+ shaders/shaders_model_shader \
shaders/shaders_multi_sample2d \
- shaders/shaders_write_depth \
- shaders/shaders_hybrid_render
+ shaders/shaders_palette_switch \
+ shaders/shaders_postprocessing \
+ shaders/shaders_raymarching \
+ shaders/shaders_shapes_textures \
+ shaders/shaders_simple_mask \
+ shaders/shaders_spotlight \
+ shaders/shaders_texture_drawing \
+ shaders/shaders_texture_outline \
+ shaders/shaders_texture_tiling \
+ shaders/shaders_texture_waves \
+ shaders/shaders_write_depth
AUDIO = \
+ audio/audio_mixed_processor \
audio/audio_module_playing \
audio/audio_music_stream \
audio/audio_raw_stream \
audio/audio_sound_loading \
- audio/audio_stream_effects \
- audio/audio_mixed_processor
+ audio/audio_sound_multi \
+ audio/audio_stream_effects
+
+OTHERS = \
+ others/easings_testbed \
+ others/embedded_files_loading \
+ others/raylib_opengl_interop \
+ others/raymath_vector_angle \
+ others/rlgl_compute_shader \
+ others/rlgl_standalone
CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST))
@@ -492,73 +507,83 @@ shaders: $(SHADERS)
audio: $(AUDIO)
# Compile CORE examples
-core/core_basic_window: core/core_basic_window.c
+core/core_2d_camera: core/core_2d_camera.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_basic_screen_manager: core/core_basic_screen_manager.c
+core/core_2d_camera_mouse_zoom: core/core_2d_camera_mouse_zoom.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_keys: core/core_input_keys.c
+core/core_2d_camera_platformer: core/core_2d_camera_platformer.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_mouse: core/core_input_mouse.c
+core/core_2d_camera_split_screen: core/core_2d_camera_split_screen.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_mouse_wheel: core/core_input_mouse_wheel.c
+core/core_3d_camera_first_person: core/core_3d_camera_first_person.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_gamepad: core/core_input_gamepad.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file core/resources/ps3.png@resources/ps3.png \
- --preload-file core/resources/xbox.png@resources/xbox.png
-
-core/core_input_multitouch: core/core_input_multitouch.c
+core/core_3d_camera_free: core/core_3d_camera_free.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_gestures: core/core_input_gestures.c
+core/core_3d_camera_mode: core/core_3d_camera_mode.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_input_gestures_web: core/core_input_gestures_web.c
+core/core_3d_camera_split_screen: core/core_3d_camera_split_screen.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_2d_camera: core/core_2d_camera.c
+core/core_3d_picking: core/core_3d_picking.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-core/core_2d_camera_platformer: core/core_2d_camera_platformer.c
+
+core/core_automation_events : core/core_automation_events.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+core/core_basic_window: core/core_basic_window.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_2d_camera_mouse_zoom: core/core_2d_camera_mouse_zoom.c
+core/core_basic_screen_manager: core/core_basic_screen_manager.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-core/core_2d_camera_split_screen: core/core_2d_camera_split_screen.c
+
+core/core_custom_frame_control: core/core_custom_frame_control.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_3d_camera_mode: core/core_3d_camera_mode.c
+core/core_custom_logging: core/core_custom_logging.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_3d_camera_free: core/core_3d_camera_free.c
+core/core_drop_files: core/core_drop_files.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 -s FORCE_FILESYSTEM=1
+
+core/core_input_gamepad: core/core_input_gamepad.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file core/resources/ps3.png@resources/ps3.png \
+ --preload-file core/resources/xbox.png@resources/xbox.png
+
+core/core_input_gamepad_info: core/core_input_gamepad_info.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_3d_camera_first_person: core/core_3d_camera_first_person.c
+core/core_input_gestures: core/core_input_gestures.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-core/core_3d_camera_split_screen: core/core_3d_camera_split_screen.c
+
+core/core_input_gestures_web: core/core_input_gestures_web.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_3d_picking: core/core_3d_picking.c
+core/core_input_keys: core/core_input_keys.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_world_screen: core/core_world_screen.c
+core/core_input_mouse: core/core_input_mouse.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_custom_logging: core/core_custom_logging.c
+core/core_input_mouse_wheel: core/core_input_mouse_wheel.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_window_letterbox: core/core_window_letterbox.c
+core/core_input_multitouch: core/core_input_multitouch.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_drop_files: core/core_drop_files.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 -s FORCE_FILESYSTEM=1
+# NOTE: To use multi-threading raylib must be compiled with multi-theading support (-s USE_PTHREADS=1)
+# WARNING: For security reasons multi-threading is not supported on browsers, it requires cross-origin isolation (Oct.2021)
+# WARNING: It requires raylib to be compiled using -pthread, so atomic operations and thread-local data (if any)
+# in its source were transformed to non-atomic operations and non-thread-local data
+core/core_loading_thread: core/core_loading_thread.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s USE_PTHREADS=1
core/core_random_values: core/core_random_values.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
@@ -566,6 +591,9 @@ core/core_random_values: core/core_random_values.c
core/core_scissor_test: core/core_scissor_test.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+core/core_smooth_pixelperfect: core/core_smooth_pixelperfect.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
core/core_storage_values: core/core_storage_values.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s FORCE_FILESYSTEM=1
@@ -576,21 +604,14 @@ core/core_vr_simulator: core/core_vr_simulator.c
core/core_window_flags: core/core_window_flags.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-core/core_smooth_pixelperfect: core/core_smooth_pixelperfect.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-core/core_custom_frame_control: core/core_custom_frame_control.c
+core/core_window_letterbox: core/core_window_letterbox.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
core/core_window_should_close: core/core_window_should_close.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-# NOTE: To use multi-threading raylib must be compiled with multi-theading support (-s USE_PTHREADS=1)
-# WARNING: For security reasons multi-threading is not supported on browsers, it requires cross-origin isolation (Oct.2021)
-# WARNING: It requires raylib to be compiled using -pthread, so atomic operations and thread-local data (if any)
-# in its source were transformed to non-atomic operations and non-thread-local data
-core/core_loading_thread: core/core_loading_thread.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s USE_PTHREADS=1
+core/core_world_screen: core/core_world_screen.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
# Compile SHAPES examples
@@ -600,67 +621,78 @@ shapes/shapes_basic_shapes: shapes/shapes_basic_shapes.c
shapes/shapes_bouncing_ball: shapes/shapes_bouncing_ball.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_colors_palette: shapes/shapes_colors_palette.c
+shapes/shapes_collision_area: shapes/shapes_collision_area.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_logo_raylib: shapes/shapes_logo_raylib.c
+shapes/shapes_colors_palette: shapes/shapes_colors_palette.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_logo_raylib_anim: shapes/shapes_logo_raylib_anim.c
+shapes/shapes_draw_circle_sector: shapes/shapes_draw_circle_sector.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_rectangle_scaling: shapes/shapes_rectangle_scaling.c
+shapes/shapes_draw_rectangle_rounded: shapes/shapes_draw_rectangle_rounded.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+shapes/shapes_draw_ring: shapes/shapes_draw_ring.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_lines_bezier: shapes/shapes_lines_bezier.c
+shapes/shapes_easings_ball_anim: shapes/shapes_easings_ball_anim.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_collision_area: shapes/shapes_collision_area.c
+shapes/shapes_easings_box_anim: shapes/shapes_easings_box_anim.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_following_eyes: shapes/shapes_following_eyes.c
+shapes/shapes_easings_rectangle_array: shapes/shapes_easings_rectangle_array.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_easings_ball_anim: shapes/shapes_easings_ball_anim.c
+shapes/shapes_following_eyes: shapes/shapes_following_eyes.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_easings_box_anim: shapes/shapes_easings_box_anim.c
+shapes/shapes_lines_bezier: shapes/shapes_lines_bezier.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_easings_rectangle_array: shapes/shapes_easings_rectangle_array.c
+shapes/shapes_logo_raylib: shapes/shapes_logo_raylib.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_draw_ring: shapes/shapes_draw_ring.c
+shapes/shapes_logo_raylib_anim: shapes/shapes_logo_raylib_anim.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_draw_circle_sector: shapes/shapes_draw_circle_sector.c
+shapes/shapes_rectangle_scaling: shapes/shapes_rectangle_scaling.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-shapes/shapes_draw_rectangle_rounded: shapes/shapes_draw_rectangle_rounded.c
+shapes/shapes_splines_drawing: shapes/shapes_splines_drawing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
shapes/shapes_top_down_lights: shapes/shapes_top_down_lights.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
# Compile TEXTURES examples
-textures/textures_logo_raylib: textures/textures_logo_raylib.c
+textures/textures_background_scrolling: textures/textures_background_scrolling.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/raylib_logo.png@resources/raylib_logo.png
+ --preload-file textures/resources/cyberpunk_street_background.png@resources/cyberpunk_street_background.png \
+ --preload-file textures/resources/cyberpunk_street_midground.png@resources/cyberpunk_street_midground.png \
+ --preload-file textures/resources/cyberpunk_street_foreground.png@resources/cyberpunk_street_foreground.png
-textures/textures_mouse_painting: textures/textures_mouse_painting.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+textures/textures_blend_modes: textures/textures_blend_modes.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file textures/resources/cyberpunk_street_background.png@resources/cyberpunk_street_background.png \
+ --preload-file textures/resources/cyberpunk_street_foreground.png@resources/cyberpunk_street_foreground.png
-textures/textures_sprite_anim: textures/textures_sprite_anim.c
+textures/textures_bunnymark: textures/textures_bunnymark.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/scarfy.png@resources/scarfy.png
+ --preload-file textures/resources/wabbit_alpha.png@resources/wabbit_alpha.png
-textures/textures_srcrec_dstrec: textures/textures_srcrec_dstrec.c
+textures/textures_draw_tiled: textures/textures_draw_tiled.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/scarfy.png@resources/scarfy.png
+ --preload-file textures/resources/patterns.png@resources/patterns.png
-textures/textures_image_loading: textures/textures_image_loading.c
+textures/textures_fog_of_war: textures/textures_fog_of_war.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+textures/textures_gif_player: textures/textures_gif_player.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/raylib_logo.png@resources/raylib_logo.png
+ --preload-file textures/resources/scarfy_run.gif@resources/scarfy_run.gif
textures/textures_image_drawing: textures/textures_image_drawing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
@@ -671,36 +703,49 @@ textures/textures_image_drawing: textures/textures_image_drawing.c
textures/textures_image_generation: textures/textures_image_generation.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864
+textures/textures_image_loading: textures/textures_image_loading.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file textures/resources/raylib_logo.png@resources/raylib_logo.png
+
textures/textures_image_processing: textures/textures_image_processing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file textures/resources/parrots.png@resources/parrots.png
+textures/textures_image_rotate: textures/textures_image_rotate.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file textures/resources/raylib_logo.png
+
textures/textures_image_text: textures/textures_image_text.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file textures/resources/parrots.png@resources/parrots.png \
--preload-file textures/resources/KAISG.ttf@resources/KAISG.ttf
-textures/textures_to_image: textures/textures_to_image.c
+textures/textures_logo_raylib: textures/textures_logo_raylib.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file textures/resources/raylib_logo.png@resources/raylib_logo.png
-textures/textures_raw_data: textures/textures_raw_data.c
+textures/textures_mouse_painting: textures/textures_mouse_painting.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+textures/textures_npatch_drawing: textures/textures_npatch_drawing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/fudesumi.raw@resources/fudesumi.raw
+ --preload-file textures/resources/ninepatch_button.png@resources/ninepatch_button.png
textures/textures_particles_blending: textures/textures_particles_blending.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file textures/resources/spark_flame.png@resources/spark_flame.png
-textures/textures_npatch_drawing: textures/textures_npatch_drawing.c
+textures/textures_polygon: textures/textures_polygon.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/ninepatch_button.png@resources/ninepatch_button.png
+ --preload-file textures/resources/cat.png@resources/cat.png
-textures/textures_background_scrolling: textures/textures_background_scrolling.c
+textures/textures_raw_data: textures/textures_raw_data.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/cyberpunk_street_background.png@resources/cyberpunk_street_background.png \
- --preload-file textures/resources/cyberpunk_street_midground.png@resources/cyberpunk_street_midground.png \
- --preload-file textures/resources/cyberpunk_street_foreground.png@resources/cyberpunk_street_foreground.png
+ --preload-file textures/resources/fudesumi.raw@resources/fudesumi.raw
+
+textures/textures_sprite_anim: textures/textures_sprite_anim.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file textures/resources/scarfy.png@resources/scarfy.png
textures/textures_sprite_button: textures/textures_sprite_button.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
@@ -712,51 +757,35 @@ textures/textures_sprite_explosion: textures/textures_sprite_explosion.c
--preload-file textures/resources/explosion.png@resources/explosion.png \
--preload-file textures/resources/boom.wav@resources/boom.wav
-textures/textures_textured_curve: textures/textures_textured_curve.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/road.png@resources/road.png
-
-textures/textures_bunnymark: textures/textures_bunnymark.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/wabbit_alpha.png@resources/wabbit_alpha.png
-
-textures/textures_blend_modes: textures/textures_blend_modes.c
+textures/textures_srcrec_dstrec: textures/textures_srcrec_dstrec.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/cyberpunk_street_background.png@resources/cyberpunk_street_background.png \
- --preload-file textures/resources/cyberpunk_street_foreground.png@resources/cyberpunk_street_foreground.png
+ --preload-file textures/resources/scarfy.png@resources/scarfy.png
-textures/textures_draw_tiled: textures/textures_draw_tiled.c
+textures/textures_svg_loading: textures/textures_svg_loading.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/patterns.png@resources/patterns.png
+ --preload-file textures/resources/test.svg
-textures/textures_polygon: textures/textures_polygon.c
+textures/textures_textured_curve: textures/textures_textured_curve.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/cat.png@resources/cat.png
+ --preload-file textures/resources/road.png@resources/road.png
-textures/textures_gif_player: textures/textures_gif_player.c
+textures/textures_to_image: textures/textures_to_image.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file textures/resources/scarfy_run.gif@resources/scarfy_run.gif
+ --preload-file textures/resources/raylib_logo.png@resources/raylib_logo.png
-textures/textures_fog_of_war: textures/textures_fog_of_war.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
# Compile TEXT examples
-text/text_raylib_fonts: text/text_raylib_fonts.c
+text/text_codepoints_loading: text/text_codepoints_loading.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file text/resources/fonts/alagard.png@resources/fonts/alagard.png \
- --preload-file text/resources/fonts/pixelplay.png@resources/fonts/pixelplay.png \
- --preload-file text/resources/fonts/mecha.png@resources/fonts/mecha.png \
- --preload-file text/resources/fonts/setback.png@resources/fonts/setback.png \
- --preload-file text/resources/fonts/romulus.png@resources/fonts/romulus.png \
- --preload-file text/resources/fonts/pixantiqua.png@resources/fonts/pixantiqua.png \
- --preload-file text/resources/fonts/alpha_beta.png@resources/fonts/alpha_beta.png \
- --preload-file text/resources/fonts/jupiter_crash.png@resources/fonts/jupiter_crash.png
-
-text/text_font_spritefont: text/text_font_spritefont.c
+ --preload-file text/resources/DotGothic16-Regular.ttf@resources/DotGothic16-Regular.ttf
+
+text/text_draw_3d: text/text_draw_3d.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file text/resources/custom_mecha.png@resources/custom_mecha.png \
- --preload-file text/resources/custom_alagard.png@resources/custom_alagard.png \
- --preload-file text/resources/custom_jupiter_crash.png@resources/custom_jupiter_crash.png
+ --preload-file text/resources/shaders/glsl100/alpha_discard.fs@resources/shaders/glsl100/alpha_discard.fs
+
+text/text_font_filters: text/text_font_filters.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
+ --preload-file text/resources/KAISG.ttf@resources/KAISG.ttf
text/text_font_loading: text/text_font_loading.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
@@ -764,23 +793,33 @@ text/text_font_loading: text/text_font_loading.c
--preload-file text/resources/pixantiqua.png@resources/pixantiqua.png \
--preload-file text/resources/pixantiqua.ttf@resources/pixantiqua.ttf
-text/text_font_filters: text/text_font_filters.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
- --preload-file text/resources/KAISG.ttf@resources/KAISG.ttf
-
text/text_font_sdf: text/text_font_sdf.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file text/resources/anonymous_pro_bold.ttf@resources/anonymous_pro_bold.ttf \
--preload-file text/resources/shaders/glsl100/sdf.fs@resources/shaders/glsl100/sdf.fs
+text/text_font_spritefont: text/text_font_spritefont.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file text/resources/custom_mecha.png@resources/custom_mecha.png \
+ --preload-file text/resources/custom_alagard.png@resources/custom_alagard.png \
+ --preload-file text/resources/custom_jupiter_crash.png@resources/custom_jupiter_crash.png
+
text/text_format_text: text/text_format_text.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
text/text_input_box: text/text_input_box.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-text/text_writing_anim: text/text_writing_anim.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+text/text_raylib_fonts: text/text_raylib_fonts.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file text/resources/fonts/alagard.png@resources/fonts/alagard.png \
+ --preload-file text/resources/fonts/pixelplay.png@resources/fonts/pixelplay.png \
+ --preload-file text/resources/fonts/mecha.png@resources/fonts/mecha.png \
+ --preload-file text/resources/fonts/setback.png@resources/fonts/setback.png \
+ --preload-file text/resources/fonts/romulus.png@resources/fonts/romulus.png \
+ --preload-file text/resources/fonts/pixantiqua.png@resources/fonts/pixantiqua.png \
+ --preload-file text/resources/fonts/alpha_beta.png@resources/fonts/alpha_beta.png \
+ --preload-file text/resources/fonts/jupiter_crash.png@resources/fonts/jupiter_crash.png
text/text_rectangle_bounds: text/text_rectangle_bounds.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
@@ -794,13 +833,9 @@ text/text_unicode: text/text_unicode.c
--preload-file text/resources/symbola.fnt@resources/symbola.fnt \
--preload-file text/resources/symbola.png@resources/symbola.png
-text/text_draw_3d: text/text_draw_3d.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file text/resources/shaders/glsl100/alpha_discard.fs@resources/shaders/glsl100/alpha_discard.fs
+text/text_writing_anim: text/text_writing_anim.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-text/text_codepoints_loading: text/text_codepoints_loading.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file text/resources/DotGothic16-Regular.ttf@resources/DotGothic16-Regular.ttf
# Compile MODELS examples
models/models_animation: models/models_animation.c
@@ -832,26 +867,16 @@ models/models_first_person_maze: models/models_first_person_maze.c
models/models_geometric_shapes: models/models_geometric_shapes.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-models/models_mesh_generation: models/models_mesh_generation.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
-
-models/models_mesh_picking: models/models_mesh_picking.c
+
+models/models_heightmap: models/models_heightmap.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file models/resources/models/obj/turret.obj@resources/models/obj/turret.obj \
- --preload-file models/resources/models/obj/turret_diffuse.png@resources/models/obj/turret_diffuse.png
+ --preload-file models/resources/heightmap.png@resources/heightmap.png
models/models_loading: models/models_loading.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file models/resources/models/obj/castle.obj@resources/models/obj/castle.obj \
--preload-file models/resources/models/obj/castle_diffuse.png@resources/models/obj/castle_diffuse.png
-
-models/models_loading_vox: models/models_loading_vox.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
- --preload-file models/resources/models/vox/chr_knight.vox@resources/models/vox/chr_knight.vox \
- --preload-file models/resources/models/vox/chr_sword.vox@resources/models/vox/chr_sword.vox \
- --preload-file models/resources/models/vox/monu9.vox@resources/models/vox/monu9.vox
-
+
models/models_loading_gltf: models/models_loading_gltf.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file models/resources/models/gltf/robot.glb@resources/models/gltf/robot.glb
@@ -859,6 +884,20 @@ models/models_loading_gltf: models/models_loading_gltf.c
models/models_loading_m3d: models/models_loading_m3d.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file models/resources/models/m3d/cesium_man.m3d@resources/models/m3d/cesium_man.m3d
+
+models/models_loading_vox: models/models_loading_vox.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
+ --preload-file models/resources/models/vox/chr_knight.vox@resources/models/vox/chr_knight.vox \
+ --preload-file models/resources/models/vox/chr_sword.vox@resources/models/vox/chr_sword.vox \
+ --preload-file models/resources/models/vox/monu9.vox@resources/models/vox/monu9.vox
+
+models/models_mesh_generation: models/models_mesh_generation.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+models/models_mesh_picking: models/models_mesh_picking.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file models/resources/models/obj/turret.obj@resources/models/obj/turret.obj \
+ --preload-file models/resources/models/obj/turret_diffuse.png@resources/models/obj/turret_diffuse.png
models/models_orthographic_projection: models/models_orthographic_projection.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
@@ -874,30 +913,21 @@ models/models_skybox: models/models_skybox.c
--preload-file models/resources/shaders/glsl100/cubemap.vs@resources/shaders/glsl100/cubemap.vs \
--preload-file models/resources/shaders/glsl100/cubemap.fs@resources/shaders/glsl100/cubemap.fs
+models/models_waving_cubes: models/models_waving_cubes.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
models/models_yaw_pitch_roll: models/models_yaw_pitch_roll.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file models/resources/models/obj/plane.obj@resources/models/obj/plane.obj \
--preload-file models/resources/models/obj/plane_diffuse.png@resources/models/obj/plane_diffuse.png
-models/models_heightmap: models/models_heightmap.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file models/resources/heightmap.png@resources/heightmap.png
-
-models/models_waving_cubes: models/models_waving_cubes.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
# Compile SHADER examples
-shaders/shaders_model_shader: shaders/shaders_model_shader.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
- --preload-file shaders/resources/models/watermill.obj@resources/models/watermill.obj \
- --preload-file shaders/resources/models/watermill_diffuse.png@resources/models/watermill_diffuse.png \
- --preload-file shaders/resources/shaders/glsl100/grayscale.fs@resources/shaders/glsl100/grayscale.fs
-
-shaders/shaders_shapes_textures: shaders/shaders_shapes_textures.c
+shaders/shaders_basic_lighting: shaders/shaders_basic_lighting.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/fudesumi.png@resources/fudesumi.png \
- --preload-file shaders/resources/shaders/glsl100/base.vs@resources/shaders/glsl100/base.vs \
- --preload-file shaders/resources/shaders/glsl100/grayscale.fs@resources/shaders/glsl100/grayscale.fs
+ --preload-file shaders/resources/texel_checker.png@resources/texel_checker.png \
+ --preload-file shaders/resources/shaders/glsl100/lighting.fs@resources/shaders/glsl100/lighting.fs \
+ --preload-file shaders/resources/shaders/glsl100/lighting.vs@resources/shaders/glsl100/lighting.vs
shaders/shaders_custom_uniform: shaders/shaders_custom_uniform.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
@@ -905,48 +935,78 @@ shaders/shaders_custom_uniform: shaders/shaders_custom_uniform.c
--preload-file shaders/resources/models/barracks_diffuse.png@resources/models/barracks_diffuse.png \
--preload-file shaders/resources/shaders/glsl100/swirl.fs@resources/shaders/glsl100/swirl.fs
-shaders/shaders_postprocessing: shaders/shaders_postprocessing.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
- --preload-file shaders/resources/models/church.obj@resources/models/church.obj \
- --preload-file shaders/resources/models/church_diffuse.png@resources/models/church_diffuse.png \
- --preload-file shaders/resources/shaders/glsl100@resources/shaders/glsl100
-
-shaders/shaders_palette_switch: shaders/shaders_palette_switch.c
+shaders/shaders_deferred_render: shaders/shaders_deferred_render.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/palette_switch.fs@resources/shaders/glsl100/palette_switch.fs
+ --preload-file shaders/resources/fudesumi.png@resources/fudesumi.png \
+ --preload-file shaders/resources/shaders/glsl330/gbuffer.vs@resources/shaders/glsl330/gbuffer.vs \
+ --preload-file shaders/resources/shaders/glsl330/gbuffer.fs@resources/shaders/glsl330/gbuffer.fs \
+ --preload-file shaders/resources/shaders/glsl330/deferred_shading.fs@resources/shaders/glsl330/deferred_shading.fs \
+ --preload-file shaders/resources/shaders/glsl330/deferred_shading.fs@resources/shaders/glsl330/deferred_shading.fs
-shaders/shaders_raymarching: shaders/shaders_raymarching.c
+shaders/shaders_eratosthenes: shaders/shaders_eratosthenes.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/raymarching.fs@resources/shaders/glsl100/raymarching.fs
+ --preload-file shaders/resources/shaders/glsl100/eratosthenes.fs@resources/shaders/glsl100/eratosthenes.fs
-shaders/shaders_texture_drawing: shaders/shaders_texture_drawing.c
+shaders/shaders_fog: shaders/shaders_fog.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/cubes_panning.fs@resources/shaders/glsl100/cubes_panning.fs
+ --preload-file shaders/resources/texel_checker.png@resources/texel_checker.png \
+ --preload-file shaders/resources/shaders/glsl100/fog.fs@resources/shaders/glsl100/fog.fs \
+ --preload-file shaders/resources/shaders/glsl100/lighting.vs@resources/shaders/glsl100/lighting.vs
-shaders/shaders_texture_waves: shaders/shaders_texture_waves.c
+shaders/shaders_hot_reloading: shaders/shaders_hot_reloading.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s FORCE_FILESYSTEM=1 \
+ --preload-file shaders/resources/shaders/glsl100/reload.fs@resources/shaders/glsl100/reload.fs
+
+shaders/shaders_hybrid_render: shaders/shaders_hybrid_render.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/space.png@resources/space.png \
- --preload-file shaders/resources/shaders/glsl100/wave.fs@resources/shaders/glsl100/wave.fs
+ --preload-file shaders/resources/shaders/glsl100/hybrid_raymarch.fs@resources/shaders/glsl100/hybrid_raymarch.fs \
+ --preload-file shaders/resources/shaders/glsl100/hybrid_raster.fs@resources/shaders/glsl100/hybrid_raster.fs
shaders/shaders_julia_set: shaders/shaders_julia_set.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file shaders/resources/shaders/glsl100/julia_set.fs@resources/shaders/glsl100/julia_set.fs
-shaders/shaders_eratosthenes: shaders/shaders_eratosthenes.c
+shaders/shaders_lightmap: shaders/shaders_lightmap.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s FORCE_FILESYSTEM=1 \
+ --preload-file shaders/resources/shaders/glsl330/lightmap.vs \
+ --preload-file shaders/resources/shaders/glsl330/lightmap.fs \
+ --preload-file shaders/resources/cubicmap_atlas.png \
+ --preload-file shaders/resources/spark_flame.png
+
+shaders/shaders_mesh_instancing: shaders/shaders_mesh_instancing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/eratosthenes.fs@resources/shaders/glsl100/eratosthenes.fs
+ --preload-file shaders/resources/shaders/glsl100/lighting_instancing.vs@resources/shaders/glsl100/lighting_instancing.vs \
+ --preload-file shaders/resources/shaders/glsl100/lighting.fs@resources/shaders/glsl100/lighting.fs
-shaders/shaders_basic_lighting: shaders/shaders_basic_lighting.c
+shaders/shaders_model_shader: shaders/shaders_model_shader.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
+ --preload-file shaders/resources/models/watermill.obj@resources/models/watermill.obj \
+ --preload-file shaders/resources/models/watermill_diffuse.png@resources/models/watermill_diffuse.png \
+ --preload-file shaders/resources/shaders/glsl100/grayscale.fs@resources/shaders/glsl100/grayscale.fs
+
+shaders/shaders_multi_sample2d: shaders/shaders_multi_sample2d.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/texel_checker.png@resources/texel_checker.png \
- --preload-file shaders/resources/shaders/glsl100/lighting.fs@resources/shaders/glsl100/lighting.fs \
- --preload-file shaders/resources/shaders/glsl100/lighting.vs@resources/shaders/glsl100/lighting.vs
+ --preload-file shaders/resources/shaders/glsl100/color_mix.fs@resources/shaders/glsl100/color_mix.fs
-shaders/shaders_fog: shaders/shaders_fog.c
+shaders/shaders_palette_switch: shaders/shaders_palette_switch.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/texel_checker.png@resources/texel_checker.png \
- --preload-file shaders/resources/shaders/glsl100/fog.fs@resources/shaders/glsl100/fog.fs \
- --preload-file shaders/resources/shaders/glsl100/lighting.vs@resources/shaders/glsl100/lighting.vs
+ --preload-file shaders/resources/shaders/glsl100/palette_switch.fs@resources/shaders/glsl100/palette_switch.fs
+
+shaders/shaders_postprocessing: shaders/shaders_postprocessing.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
+ --preload-file shaders/resources/models/church.obj@resources/models/church.obj \
+ --preload-file shaders/resources/models/church_diffuse.png@resources/models/church_diffuse.png \
+ --preload-file shaders/resources/shaders/glsl100@resources/shaders/glsl100
+
+shaders/shaders_raymarching: shaders/shaders_raymarching.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file shaders/resources/shaders/glsl100/raymarching.fs@resources/shaders/glsl100/raymarching.fs
+
+shaders/shaders_shapes_textures: shaders/shaders_shapes_textures.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file shaders/resources/fudesumi.png@resources/fudesumi.png \
+ --preload-file shaders/resources/shaders/glsl100/base.vs@resources/shaders/glsl100/base.vs \
+ --preload-file shaders/resources/shaders/glsl100/grayscale.fs@resources/shaders/glsl100/grayscale.fs
shaders/shaders_simple_mask: shaders/shaders_simple_mask.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
@@ -959,34 +1019,36 @@ shaders/shaders_spotlight: shaders/shaders_spotlight.c
--preload-file shaders/resources/raysan.png@resources/raysan.png \
--preload-file shaders/resources/shaders/glsl100/spotlight.fs@resources/shaders/glsl100/spotlight.fs
-shaders/shaders_hot_reloading: shaders/shaders_hot_reloading.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s FORCE_FILESYSTEM=1 \
- --preload-file shaders/resources/shaders/glsl100/reload.fs@resources/shaders/glsl100/reload.fs
-
-shaders/shaders_mesh_instancing: shaders/shaders_mesh_instancing.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/lighting_instancing.vs@resources/shaders/glsl100/lighting_instancing.vs \
- --preload-file shaders/resources/shaders/glsl100/lighting.fs@resources/shaders/glsl100/lighting.fs
-
-shaders/shaders_multi_sample2d: shaders/shaders_multi_sample2d.c
+shaders/shaders_texture_drawing: shaders/shaders_texture_drawing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/color_mix.fs@resources/shaders/glsl100/color_mix.fs
+ --preload-file shaders/resources/shaders/glsl100/cubes_panning.fs@resources/shaders/glsl100/cubes_panning.fs
shaders/shaders_texture_outline: shaders/shaders_texture_outline.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file shaders/resources/shaders/glsl100/outline.fs@resources/shaders/glsl100/outline.fs \
--preload-file shaders/resources/fudesumi.png@resources/fudesumi.png
+shaders/shaders_texture_tiling: shaders/shaders_texture_tiling.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file shaders/resources/shaders/glsl100/tiling.fs@resources/shaders/glsl100/tiling.fs \
+ --preload-file shaders/resources/cubicmap_atlas.png@resources/cubicmap_atlas.png
+
+shaders/shaders_texture_waves: shaders/shaders_texture_waves.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file shaders/resources/space.png@resources/space.png \
+ --preload-file shaders/resources/shaders/glsl100/wave.fs@resources/shaders/glsl100/wave.fs
+
shaders/shaders_write_depth: shaders/shaders_write_depth.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file shaders/resources/shaders/glsl100/write_depth.fs@resources/shaders/glsl100/write_depth.fs
-shaders/shaders_hybrid_render: shaders/shaders_hybrid_render.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
- --preload-file shaders/resources/shaders/glsl100/hybrid_raymarch.fs@resources/shaders/glsl100/hybrid_raymarch.fs \
- --preload-file shaders/resources/shaders/glsl100/hybrid_raster.fs@resources/shaders/glsl100/hybrid_raster.fs
# Compile AUDIO examples
+audio/audio_mixed_processor: audio/audio_mixed_processor.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
+ --preload-file audio/resources/country.mp3@resources/country.mp3 \
+ --preload-file audio/resources/coin.wav@resources/coin.wav
+
audio/audio_module_playing: audio/audio_module_playing.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
--preload-file audio/resources/mini1111.xm@resources/mini1111.xm
@@ -1003,14 +1065,33 @@ audio/audio_sound_loading: audio/audio_sound_loading.c
--preload-file audio/resources/sound.wav@resources/sound.wav \
--preload-file audio/resources/target.ogg@resources/target.ogg
+audio/audio_sound_multi: audio/audio_sound_multi.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) \
+ --preload-file audio/resources/sound.wav@resources/sound.wav
+
audio/audio_stream_effects: audio/audio_stream_effects.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
--preload-file audio/resources/country.mp3@resources/country.mp3
-audio/audio_mixed_processor: audio/audio_mixed_processor.c
- $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -s TOTAL_MEMORY=67108864 \
- --preload-file audio/resources/country.mp3@resources/country.mp3 \
- --preload-file audio/resources/coin.wav@resources/coin.wav
+
+# Compile OTHERS examples
+others/easings_testbed: others/easings_testbed.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+others/embedded_files_loading: others/embedded_files_loading.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+others/raylib_opengl_interop:
+ $(info Skipping_others_raylib_opengl_interop)
+
+others/raymath_vector_angle: others/raymath_vector_angle.c
+ $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
+
+others/rlgl_compute_shader:
+ $(info Skipping_others_rlgl_compute_shader)
+
+others/rlgl_standalone:
+ $(info Skipping_others_rlgl_standalone)
# Clean everything
clean:
diff --git a/raylib/examples/README.md b/raylib/examples/README.md
index 82e4b78..0fed8ac 100644
--- a/raylib/examples/README.md
+++ b/raylib/examples/README.md
@@ -176,6 +176,7 @@ Examples using raylib shaders functionality, including shaders loading, paramete
| 114 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | <img src="shaders/shaders_mesh_instancing.png" alt="shaders_mesh_instancing" width="80"> | ⭐️⭐️⭐️⭐️ | 3.7 | **4.2** | [seanpringle](https://github.com/seanpringle) |
| 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) |
+| 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) |
### category: audio
@@ -183,10 +184,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 |
|----|----------|--------|:-------------------:|:------------------:|:------------------:|:----------|
-| 117 | [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) |
-| 118 | [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) |
-| 119 | [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) |
-| 120 | [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) |
+| 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_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_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
diff --git a/raylib/examples/core/core_2d_camera.c b/raylib/examples/core/core_2d_camera.c
index 24cca69..759c099 100644
--- a/raylib/examples/core/core_2d_camera.c
+++ b/raylib/examples/core/core_2d_camera.c
@@ -1,6 +1,6 @@
/*******************************************************************************************
*
-* raylib [core] example - 2d camera
+* raylib [core] example - 2D Camera system
*
* Example originally created with raylib 1.5, last time updated with raylib 3.0
*
diff --git a/raylib/examples/core/core_2d_camera_platformer.c b/raylib/examples/core/core_2d_camera_platformer.c
index b149ea8..72b1ee1 100644
--- a/raylib/examples/core/core_2d_camera_platformer.c
+++ b/raylib/examples/core/core_2d_camera_platformer.c
@@ -1,6 +1,6 @@
/*******************************************************************************************
*
-* raylib [core] example - 2d camera platformer
+* raylib [core] example - 2D Camera platformer
*
* Example originally created with raylib 2.5, last time updated with raylib 3.0
*
diff --git a/raylib/examples/core/core_2d_camera_split_screen.c b/raylib/examples/core/core_2d_camera_split_screen.c
index 57a0dfd..60b5a2e 100644
--- a/raylib/examples/core/core_2d_camera_split_screen.c
+++ b/raylib/examples/core/core_2d_camera_split_screen.c
@@ -85,12 +85,12 @@ int main(void)
// Draw full scene with first camera
for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++)
{
- DrawLineV((Vector2){PLAYER_SIZE*i, 0}, (Vector2){PLAYER_SIZE*i, screenHeight}, LIGHTGRAY);
+ DrawLineV((Vector2){(float)PLAYER_SIZE*i, 0}, (Vector2){ (float)PLAYER_SIZE*i, (float)screenHeight}, LIGHTGRAY);
}
for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++)
{
- DrawLineV((Vector2){0, PLAYER_SIZE*i}, (Vector2){screenWidth, PLAYER_SIZE*i}, LIGHTGRAY);
+ DrawLineV((Vector2){0, (float)PLAYER_SIZE*i}, (Vector2){ (float)screenWidth, (float)PLAYER_SIZE*i}, LIGHTGRAY);
}
for (int i = 0; i < screenWidth/PLAYER_SIZE; i++)
@@ -118,12 +118,12 @@ int main(void)
// Draw full scene with second camera
for (int i = 0; i < screenWidth/PLAYER_SIZE + 1; i++)
{
- DrawLineV((Vector2){PLAYER_SIZE*i, 0}, (Vector2){PLAYER_SIZE*i, screenHeight}, LIGHTGRAY);
+ DrawLineV((Vector2){ (float)PLAYER_SIZE*i, 0}, (Vector2){ (float)PLAYER_SIZE*i, (float)screenHeight}, LIGHTGRAY);
}
for (int i = 0; i < screenHeight/PLAYER_SIZE + 1; i++)
{
- DrawLineV((Vector2){0, PLAYER_SIZE*i}, (Vector2){screenWidth, PLAYER_SIZE*i}, LIGHTGRAY);
+ DrawLineV((Vector2){0, (float)PLAYER_SIZE*i}, (Vector2){ (float)screenWidth, (float)PLAYER_SIZE*i}, LIGHTGRAY);
}
for (int i = 0; i < screenWidth/PLAYER_SIZE; i++)
diff --git a/raylib/examples/core/core_3d_camera_free.c b/raylib/examples/core/core_3d_camera_free.c
index 78200a6..3c30a42 100644
--- a/raylib/examples/core/core_3d_camera_free.c
+++ b/raylib/examples/core/core_3d_camera_free.c
@@ -47,7 +47,7 @@ int main(void)
//----------------------------------------------------------------------------------
UpdateCamera(&camera, CAMERA_FREE);
- if (IsKeyDown('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
+ if (IsKeyPressed('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
//----------------------------------------------------------------------------------
// Draw
@@ -65,15 +65,13 @@ int main(void)
EndMode3D();
- DrawRectangle( 10, 10, 320, 133, Fade(SKYBLUE, 0.5f));
- DrawRectangleLines( 10, 10, 320, 133, BLUE);
+ DrawRectangle( 10, 10, 320, 93, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines( 10, 10, 320, 93, BLUE);
DrawText("Free camera default controls:", 20, 20, 10, BLACK);
DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, DARKGRAY);
DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, DARKGRAY);
- DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, DARKGRAY);
- //DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, DARKGRAY);
- DrawText("- Z to zoom to (0, 0, 0)", 40, 120, 10, DARKGRAY);
+ DrawText("- Z to zoom to (0, 0, 0)", 40, 80, 10, DARKGRAY);
EndDrawing();
//----------------------------------------------------------------------------------
@@ -85,4 +83,4 @@ int main(void)
//--------------------------------------------------------------------------------------
return 0;
-} \ No newline at end of file
+}
diff --git a/raylib/examples/core/core_3d_camera_free.png b/raylib/examples/core/core_3d_camera_free.png
index 7874eed..71dfc1c 100644
--- a/raylib/examples/core/core_3d_camera_free.png
+++ b/raylib/examples/core/core_3d_camera_free.png
Binary files differ
diff --git a/raylib/examples/core/core_automation_events.c b/raylib/examples/core/core_automation_events.c
new file mode 100644
index 0000000..b58d572
--- /dev/null
+++ b/raylib/examples/core/core_automation_events.c
@@ -0,0 +1,334 @@
+/*******************************************************************************************
+*
+* raylib [core] example - automation events
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* Example based on 2d_camera_platformer example by arvyy (@arvyy)
+*
+* 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 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+#include "raymath.h"
+
+#define GRAVITY 400
+#define PLAYER_JUMP_SPD 350.0f
+#define PLAYER_HOR_SPD 200.0f
+
+#define MAX_ENVIRONMENT_ELEMENTS 5
+
+typedef struct Player {
+ Vector2 position;
+ float speed;
+ bool canJump;
+} Player;
+
+typedef struct EnvElement {
+ Rectangle rect;
+ int blocking;
+ Color color;
+} EnvElement;
+
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [core] example - automation events");
+
+ // Define player
+ Player player = { 0 };
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ // Define environment elements (platforms)
+ EnvElement envElements[MAX_ENVIRONMENT_ELEMENTS] = {
+ {{ 0, 0, 1000, 400 }, 0, LIGHTGRAY },
+ {{ 0, 400, 1000, 200 }, 1, GRAY },
+ {{ 300, 200, 400, 10 }, 1, GRAY },
+ {{ 250, 300, 100, 10 }, 1, GRAY },
+ {{ 650, 300, 100, 10 }, 1, GRAY }
+ };
+
+ // Define camera
+ Camera2D camera = { 0 };
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+
+ // Automation events
+ AutomationEventList aelist = LoadAutomationEventList(0); // Initialize list of automation events to record new events
+ SetAutomationEventList(&aelist);
+ bool eventRecording = false;
+ bool eventPlaying = false;
+
+ unsigned int frameCounter = 0;
+ unsigned int playFrameCounter = 0;
+ unsigned int currentPlayFrame = 0;
+
+ SetTargetFPS(60);
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ float deltaTime = 0.015f;//GetFrameTime();
+
+ // Dropped files logic
+ //----------------------------------------------------------------------------------
+ if (IsFileDropped())
+ {
+ FilePathList droppedFiles = LoadDroppedFiles();
+
+ // Supports loading .rgs style files (text or binary) and .png style palette images
+ if (IsFileExtension(droppedFiles.paths[0], ".txt;.rae"))
+ {
+ UnloadAutomationEventList(&aelist);
+ aelist = LoadAutomationEventList(droppedFiles.paths[0]);
+
+ eventRecording = false;
+
+ // Reset scene state to play
+ eventPlaying = true;
+ playFrameCounter = 0;
+ currentPlayFrame = 0;
+
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+ }
+
+ UnloadDroppedFiles(droppedFiles); // Unload filepaths from memory
+ }
+ //----------------------------------------------------------------------------------
+
+ // Update player
+ //----------------------------------------------------------------------------------
+ if (IsKeyDown(KEY_LEFT)) player.position.x -= PLAYER_HOR_SPD*deltaTime;
+ if (IsKeyDown(KEY_RIGHT)) player.position.x += PLAYER_HOR_SPD*deltaTime;
+ if (IsKeyDown(KEY_SPACE) && player.canJump)
+ {
+ player.speed = -PLAYER_JUMP_SPD;
+ player.canJump = false;
+ }
+
+ int hitObstacle = 0;
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ EnvElement *element = &envElements[i];
+ Vector2 *p = &(player.position);
+ if (element->blocking &&
+ element->rect.x <= p->x &&
+ element->rect.x + element->rect.width >= p->x &&
+ element->rect.y >= p->y &&
+ element->rect.y <= p->y + player.speed*deltaTime)
+ {
+ hitObstacle = 1;
+ player.speed = 0.0f;
+ p->y = element->rect.y;
+ }
+ }
+
+ if (!hitObstacle)
+ {
+ player.position.y += player.speed*deltaTime;
+ player.speed += GRAVITY*deltaTime;
+ player.canJump = false;
+ }
+ 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))
+ {
+ // Reset game state
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.0f;
+ camera.zoom = 1.0f;
+ }
+ //----------------------------------------------------------------------------------
+
+ // Update camera
+ //----------------------------------------------------------------------------------
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ float minX = 1000, minY = 1000, maxX = -1000, maxY = -1000;
+
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ EnvElement *element = &envElements[i];
+ minX = fminf(element->rect.x, minX);
+ maxX = fmaxf(element->rect.x + element->rect.width, maxX);
+ minY = fminf(element->rect.y, minY);
+ maxY = fmaxf(element->rect.y + element->rect.height, maxY);
+ }
+
+ Vector2 max = GetWorldToScreen2D((Vector2){ maxX, maxY }, camera);
+ Vector2 min = GetWorldToScreen2D((Vector2){ minX, minY }, camera);
+
+ if (max.x < screenWidth) camera.offset.x = screenWidth - (max.x - screenWidth/2);
+ if (max.y < screenHeight) camera.offset.y = screenHeight - (max.y - screenHeight/2);
+ if (min.x > 0) camera.offset.x = screenWidth/2 - min.x;
+ if (min.y > 0) camera.offset.y = screenHeight/2 - min.y;
+ //----------------------------------------------------------------------------------
+
+ // Toggle events recording
+ if (IsKeyPressed(KEY_S))
+ {
+ if (!eventPlaying)
+ {
+ if (eventRecording)
+ {
+ StopAutomationEventRecording();
+ eventRecording = false;
+
+ ExportAutomationEventList(aelist, "automation.rae");
+
+ TraceLog(LOG_INFO, "RECORDED FRAMES: %i", aelist.count);
+ }
+ else
+ {
+ SetAutomationEventBaseFrame(180);
+ StartAutomationEventRecording();
+ eventRecording = true;
+ }
+ }
+ }
+ else if (IsKeyPressed(KEY_A))
+ {
+ if (!eventRecording && (aelist.count > 0))
+ {
+ // Reset scene state to play
+ eventPlaying = true;
+ playFrameCounter = 0;
+ currentPlayFrame = 0;
+
+ player.position = (Vector2){ 400, 280 };
+ player.speed = 0;
+ player.canJump = false;
+
+ camera.target = player.position;
+ camera.offset = (Vector2){ screenWidth/2.0f, screenHeight/2.0f };
+ camera.rotation = 0.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++;
+ else frameCounter = 0;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(LIGHTGRAY);
+
+ BeginMode2D(camera);
+
+ // Draw environment elements
+ for (int i = 0; i < MAX_ENVIRONMENT_ELEMENTS; i++)
+ {
+ DrawRectangleRec(envElements[i].rect, envElements[i].color);
+ }
+
+ // Draw player rectangle
+ DrawRectangleRec((Rectangle){ player.position.x - 20, player.position.y - 40, 40, 40 }, RED);
+
+ EndMode2D();
+
+ // Draw game controls
+ DrawRectangle(10, 10, 290, 145, Fade(SKYBLUE, 0.5f));
+ DrawRectangleLines(10, 10, 290, 145, Fade(BLUE, 0.8f));
+
+ DrawText("Controls:", 20, 20, 10, BLACK);
+ DrawText("- RIGHT | LEFT: Player movement", 30, 40, 10, DARKGRAY);
+ DrawText("- SPACE: Player jump", 30, 60, 10, DARKGRAY);
+ DrawText("- R: Reset game state", 30, 80, 10, DARKGRAY);
+
+ DrawText("- S: START/STOP RECORDING INPUT EVENTS", 30, 110, 10, BLACK);
+ DrawText("- A: REPLAY LAST RECORDED INPUT EVENTS", 30, 130, 10, BLACK);
+
+ // Draw automation events recording indicator
+ if (eventRecording)
+ {
+ DrawRectangle(10, 160, 290, 30, Fade(RED, 0.3f));
+ DrawRectangleLines(10, 160, 290, 30, Fade(MAROON, 0.8f));
+ DrawCircle(30, 175, 10, MAROON);
+
+ if (((frameCounter/15)%2) == 1) DrawText(TextFormat("RECORDING EVENTS... [%i]", aelist.count), 50, 170, 10, MAROON);
+ }
+ else if (eventPlaying)
+ {
+ DrawRectangle(10, 160, 290, 30, Fade(LIME, 0.3f));
+ DrawRectangleLines(10, 160, 290, 30, Fade(DARKGREEN, 0.8f));
+ DrawTriangle((Vector2){ 20, 155 + 10 }, (Vector2){ 20, 155 + 30 }, (Vector2){ 40, 155 + 20 }, DARKGREEN);
+
+ if (((frameCounter/15)%2) == 1) DrawText(TextFormat("PLAYING RECORDED EVENTS... [%i]", currentPlayFrame), 50, 170, 10, DARKGREEN);
+ }
+
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/core/core_automation_events.png b/raylib/examples/core/core_automation_events.png
new file mode 100644
index 0000000..ac8cb3b
--- /dev/null
+++ b/raylib/examples/core/core_automation_events.png
Binary files differ
diff --git a/raylib/examples/core/core_drop_files.c b/raylib/examples/core/core_drop_files.c
index 9f62203..d4ddd9e 100644
--- a/raylib/examples/core/core_drop_files.c
+++ b/raylib/examples/core/core_drop_files.c
@@ -53,7 +53,7 @@ int main(void)
{
FilePathList droppedFiles = LoadDroppedFiles();
- for (int i = 0, offset = filePathCounter; i < droppedFiles.count; i++)
+ for (int i = 0, offset = filePathCounter; i < (int)droppedFiles.count; i++)
{
if (filePathCounter < (MAX_FILEPATH_RECORDED - 1))
{
@@ -77,7 +77,7 @@ int main(void)
{
DrawText("Dropped files:", 100, 40, 20, DARKGRAY);
- for (unsigned int i = 0; i < filePathCounter; i++)
+ for (int i = 0; i < filePathCounter; i++)
{
if (i%2 == 0) DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.5f));
else DrawRectangle(0, 85 + 40*i, screenWidth, 40, Fade(LIGHTGRAY, 0.3f));
diff --git a/raylib/examples/core/core_input_gamepad_info.c b/raylib/examples/core/core_input_gamepad_info.c
index 55f0354..9aebb81 100644
--- a/raylib/examples/core/core_input_gamepad_info.c
+++ b/raylib/examples/core/core_input_gamepad_info.c
@@ -31,40 +31,49 @@ int main(void)
InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad information");
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
// Main game loop
- while (!WindowShouldClose()) // Detect window close button or ESC key
+ while (!WindowShouldClose()) // Detect window close button or ESC key
{
- int y = 10;
+ // Update
+ //----------------------------------------------------------------------------------
+ // TODO: Update your variables here
+ //----------------------------------------------------------------------------------
+ // Draw
+ //----------------------------------------------------------------------------------
BeginDrawing();
- ClearBackground(RAYWHITE);
+ ClearBackground(RAYWHITE);
- for (int i = 0; i < 4; i++) // by default rcore.h has a MAX_GAMEPADS of 4 so mimmic that here.
- {
- if (IsGamepadAvailable(i))
+ for (int i = 0, y = 10; i < 4; i++) // MAX_GAMEPADS = 4
{
- DrawText(TextFormat("Gamepad name: %s", GetGamepadName(i)), 10, y, 20, BLACK);
- y += 30;
- DrawText(TextFormat("\tAxis count: %d", GetGamepadAxisCount(i)), 10, y, 20, BLACK);
- y += 30;
- for (int axis = 0; axis < GetGamepadAxisCount(i); axis++)
+ if (IsGamepadAvailable(i))
{
- DrawText(TextFormat("\tAxis %d = %f", axis, GetGamepadAxisMovement(i, axis)), 10, y, 20, BLACK);
+ DrawText(TextFormat("Gamepad name: %s", GetGamepadName(i)), 10, y, 20, BLACK);
y += 30;
- }
- for (int button = 0; button < 32; button++)
- {
- DrawText(TextFormat("\tButton %d = %d", button, IsGamepadButtonDown(i, button)), 10, y, 20, BLACK);
+ DrawText(TextFormat("\tAxis count: %d", GetGamepadAxisCount(i)), 10, y, 20, BLACK);
y += 30;
+
+ for (int axis = 0; axis < GetGamepadAxisCount(i); axis++)
+ {
+ DrawText(TextFormat("\tAxis %d = %f", axis, GetGamepadAxisMovement(i, axis)), 10, y, 20, BLACK);
+ y += 30;
+ }
+
+ for (int button = 0; button < 32; button++)
+ {
+ DrawText(TextFormat("\tButton %d = %d", button, IsGamepadButtonDown(i, button)), 10, y, 20, BLACK);
+ y += 30;
+ }
}
}
- }
- DrawFPS(GetScreenWidth() - 100, 100);
+ DrawFPS(GetScreenWidth() - 100, 100);
EndDrawing();
+ //----------------------------------------------------------------------------------
}
// De-Initialization
diff --git a/raylib/examples/core/core_loading_thread.c b/raylib/examples/core/core_loading_thread.c
index 0538dce..8451ff0 100644
--- a/raylib/examples/core/core_loading_thread.c
+++ b/raylib/examples/core/core_loading_thread.c
@@ -41,7 +41,7 @@ int main(void)
InitWindow(screenWidth, screenHeight, "raylib [core] example - loading thread");
- pthread_t threadId; // Loading data thread id
+ pthread_t threadId = { 0 }; // Loading data thread id
enum { STATE_WAITING, STATE_LOADING, STATE_FINISHED } state = STATE_WAITING;
int framesCounter = 0;
diff --git a/raylib/examples/core/core_random_values.c b/raylib/examples/core/core_random_values.c
index c2225bc..bec1de2 100644
--- a/raylib/examples/core/core_random_values.c
+++ b/raylib/examples/core/core_random_values.c
@@ -29,7 +29,7 @@ int main(void)
int randValue = GetRandomValue(-8, 5); // Get a random integer number between -8 and 5 (both included)
- int framesCounter = 0; // Variable used to count frames
+ unsigned int framesCounter = 0; // Variable used to count frames
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
diff --git a/raylib/examples/core/core_smooth_pixelperfect.c b/raylib/examples/core/core_smooth_pixelperfect.c
index 776706c..3d5ed94 100644
--- a/raylib/examples/core/core_smooth_pixelperfect.c
+++ b/raylib/examples/core/core_smooth_pixelperfect.c
@@ -1,6 +1,6 @@
/*******************************************************************************************
*
-* raylib [core] example - smooth pixel-perfect camera
+* raylib [core] example - Smooth Pixel-perfect camera
*
* Example originally created with raylib 3.7, last time updated with raylib 4.0
*
diff --git a/raylib/examples/core/core_storage_values.c b/raylib/examples/core/core_storage_values.c
index 1273991..c7fd7d9 100644
--- a/raylib/examples/core/core_storage_values.c
+++ b/raylib/examples/core/core_storage_values.c
@@ -104,7 +104,7 @@ int main(void)
bool SaveStorageValue(unsigned int position, int value)
{
bool success = false;
- unsigned int dataSize = 0;
+ int dataSize = 0;
unsigned int newDataSize = 0;
unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize);
unsigned char *newFileData = NULL;
@@ -172,7 +172,7 @@ bool SaveStorageValue(unsigned int position, int value)
int LoadStorageValue(unsigned int position)
{
int value = 0;
- unsigned int dataSize = 0;
+ int dataSize = 0;
unsigned char *fileData = LoadFileData(STORAGE_DATA_FILE, &dataSize);
if (fileData != NULL)
diff --git a/raylib/examples/models/models_animation.c b/raylib/examples/models/models_animation.c
index ffe2d01..8e6f7f8 100644
--- a/raylib/examples/models/models_animation.c
+++ b/raylib/examples/models/models_animation.c
@@ -48,7 +48,7 @@ int main(void)
Vector3 position = { 0.0f, 0.0f, 0.0f }; // Set model position
// Load animation data
- unsigned int animsCount = 0;
+ int animsCount = 0;
ModelAnimation *anims = LoadModelAnimations("resources/models/iqm/guyanim.iqm", &animsCount);
int animFrameCounter = 0;
diff --git a/raylib/examples/models/models_loading_gltf.c b/raylib/examples/models/models_loading_gltf.c
index 2884731..1d5d516 100644
--- a/raylib/examples/models/models_loading_gltf.c
+++ b/raylib/examples/models/models_loading_gltf.c
@@ -44,7 +44,7 @@ int main(void)
Model model = LoadModel("resources/models/gltf/robot.glb");
// Load gltf model animations
- unsigned int animsCount = 0;
+ int animsCount = 0;
unsigned int animIndex = 0;
unsigned int animCurrentFrame = 0;
ModelAnimation *modelAnimations = LoadModelAnimations("resources/models/gltf/robot.glb", &animsCount);
diff --git a/raylib/examples/models/models_loading_m3d.c b/raylib/examples/models/models_loading_m3d.c
index 1e56d51..71dbc8d 100644
--- a/raylib/examples/models/models_loading_m3d.c
+++ b/raylib/examples/models/models_loading_m3d.c
@@ -50,7 +50,7 @@ int main(void)
Model model = LoadModel(modelFileName); // Load the bind-pose model mesh and basic data
// Load animations
- unsigned int animsCount = 0;
+ int animsCount = 0;
int animFrameCounter = 0, animId = 0;
ModelAnimation *anims = LoadModelAnimations(modelFileName, &animsCount); // Load skeletal animation data
@@ -85,7 +85,7 @@ int main(void)
animFrameCounter = 0;
animId++;
- if (animId >= animsCount) animId = 0;
+ if (animId >= (int)animsCount) animId = 0;
UpdateModelAnimation(model, anims[animId], 0);
animPlaying = true;
}
diff --git a/raylib/examples/models/models_mesh_generation.c b/raylib/examples/models/models_mesh_generation.c
index d17a20a..94e0a4c 100644
--- a/raylib/examples/models/models_mesh_generation.c
+++ b/raylib/examples/models/models_mesh_generation.c
@@ -36,7 +36,7 @@ int main(void)
Model models[NUM_MODELS] = { 0 };
- models[0] = LoadModelFromMesh(GenMeshPlane(2, 2, 5, 5));
+ models[0] = LoadModelFromMesh(GenMeshPlane(2, 2, 4, 3));
models[1] = LoadModelFromMesh(GenMeshCube(2.0f, 1.0f, 2.0f));
models[2] = LoadModelFromMesh(GenMeshSphere(2, 32, 32));
models[3] = LoadModelFromMesh(GenMeshHemiSphere(2, 16, 16));
diff --git a/raylib/examples/models/models_skybox.c b/raylib/examples/models/models_skybox.c
index 7a500e0..c583128 100644
--- a/raylib/examples/models/models_skybox.c
+++ b/raylib/examples/models/models_skybox.c
@@ -68,14 +68,12 @@ int main(void)
char skyboxFileName[256] = { 0 };
- Texture2D panorama;
-
if (useHDR)
{
TextCopy(skyboxFileName, "resources/dresden_square_2k.hdr");
// Load HDR panorama (sphere) texture
- panorama = LoadTexture(skyboxFileName);
+ Texture2D panorama = LoadTexture(skyboxFileName);
// Generate cubemap (texture with 6 quads-cube-mapping) from panorama HDR texture
// NOTE 1: New texture is generated rendering to texture, shader calculates the sphere->cube coordinates mapping
@@ -83,7 +81,7 @@ int main(void)
// despite texture can be successfully created.. so using PIXELFORMAT_UNCOMPRESSED_R8G8B8A8 instead of PIXELFORMAT_UNCOMPRESSED_R32G32B32A32
skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8);
- //UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
+ UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
}
else
{
@@ -113,15 +111,18 @@ int main(void)
{
if (IsFileExtension(droppedFiles.paths[0], ".png;.jpg;.hdr;.bmp;.tga"))
{
- // Unload current cubemap texture and load new one
+ // Unload current cubemap texture to load new one
UnloadTexture(skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture);
+
if (useHDR)
{
+ // Load HDR panorama (sphere) texture
Texture2D panorama = LoadTexture(droppedFiles.paths[0]);
// Generate cubemap from panorama texture
skybox.materials[0].maps[MATERIAL_MAP_CUBEMAP].texture = GenTextureCubemap(shdrCubemap, panorama, 1024, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8);
- UnloadTexture(panorama);
+
+ UnloadTexture(panorama); // Texture not required anymore, cubemap already generated
}
else
{
diff --git a/raylib/examples/others/external/include/GLFW/glfw3.h b/raylib/examples/others/external/include/GLFW/glfw3.h
index 990fe3f..31b201a 100644
--- a/raylib/examples/others/external/include/GLFW/glfw3.h
+++ b/raylib/examples/others/external/include/GLFW/glfw3.h
@@ -3,7 +3,7 @@
* A library for OpenGL, window and input
*------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard
- * Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>
+ * Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
@@ -52,7 +52,7 @@ extern "C" {
* This is the reference documentation for OpenGL and OpenGL ES context related
* functions. For more task-oriented information, see the @ref context_guide.
*/
-/*! @defgroup vulkan Vulkan reference
+/*! @defgroup vulkan Vulkan support reference
* @brief Functions and types related to Vulkan.
*
* This is the reference documentation for Vulkan related functions and types.
@@ -96,11 +96,30 @@ extern "C" {
#define _WIN32
#endif /* _WIN32 */
+/* Include because most Windows GLU headers need wchar_t and
+ * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h.
+ * Include it unconditionally to avoid surprising side-effects.
+ */
+#include <stddef.h>
+
+/* Include because it is needed by Vulkan and related functions.
+ * Include it unconditionally to avoid surprising side-effects.
+ */
+#include <stdint.h>
+
+#if defined(GLFW_INCLUDE_VULKAN)
+ #include <vulkan/vulkan.h>
+#endif /* Vulkan header */
+
+/* The Vulkan header may have indirectly included windows.h (because of
+ * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it.
+ */
+
/* It is customary to use APIENTRY for OpenGL function pointer declarations on
* all platforms. Additionally, the Windows OpenGL header needs APIENTRY.
*/
-#ifndef APIENTRY
- #ifdef _WIN32
+#if !defined(APIENTRY)
+ #if defined(_WIN32)
#define APIENTRY __stdcall
#else
#define APIENTRY
@@ -122,17 +141,6 @@ extern "C" {
#define GLFW_CALLBACK_DEFINED
#endif /* CALLBACK */
-/* Include because most Windows GLU headers need wchar_t and
- * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h.
- * Include it unconditionally to avoid surprising side-effects.
- */
-#include <stddef.h>
-
-/* Include because it is needed by Vulkan and related functions.
- * Include it unconditionally to avoid surprising side-effects.
- */
-#include <stdint.h>
-
/* Include the chosen OpenGL or OpenGL ES headers.
*/
#if defined(GLFW_INCLUDE_ES1)
@@ -182,10 +190,44 @@ extern "C" {
#else /*__APPLE__*/
#include <GL/glcorearb.h>
+ #if defined(GLFW_INCLUDE_GLEXT)
+ #include <GL/glext.h>
+ #endif
#endif /*__APPLE__*/
-#elif !defined(GLFW_INCLUDE_NONE)
+#elif defined(GLFW_INCLUDE_GLU)
+
+ #if defined(__APPLE__)
+
+ #if defined(GLFW_INCLUDE_GLU)
+ #include <OpenGL/glu.h>
+ #endif
+
+ #else /*__APPLE__*/
+
+ #if defined(GLFW_INCLUDE_GLU)
+ #include <GL/glu.h>
+ #endif
+
+ #endif /*__APPLE__*/
+
+#elif !defined(GLFW_INCLUDE_NONE) && \
+ !defined(__gl_h_) && \
+ !defined(__gles1_gl_h_) && \
+ !defined(__gles2_gl2_h_) && \
+ !defined(__gles2_gl3_h_) && \
+ !defined(__gles2_gl31_h_) && \
+ !defined(__gles2_gl32_h_) && \
+ !defined(__gl_glcorearb_h_) && \
+ !defined(__gl2_h_) /*legacy*/ && \
+ !defined(__gl3_h_) /*legacy*/ && \
+ !defined(__gl31_h_) /*legacy*/ && \
+ !defined(__gl32_h_) /*legacy*/ && \
+ !defined(__glcorearb_h_) /*legacy*/ && \
+ !defined(__GL_H__) /*non-standard*/ && \
+ !defined(__gltypes_h_) /*non-standard*/ && \
+ !defined(__glee_h_) /*non-standard*/
#if defined(__APPLE__)
@@ -193,9 +235,6 @@ extern "C" {
#define GL_GLEXT_LEGACY
#endif
#include <OpenGL/gl.h>
- #if defined(GLFW_INCLUDE_GLU)
- #include <OpenGL/glu.h>
- #endif
#else /*__APPLE__*/
@@ -203,18 +242,11 @@ extern "C" {
#if defined(GLFW_INCLUDE_GLEXT)
#include <GL/glext.h>
#endif
- #if defined(GLFW_INCLUDE_GLU)
- #include <GL/glu.h>
- #endif
#endif /*__APPLE__*/
#endif /* OpenGL and OpenGL ES headers */
-#if defined(GLFW_INCLUDE_VULKAN)
- #include <vulkan/vulkan.h>
-#endif /* Vulkan header */
-
#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)
/* GLFW_DLL must be defined by applications that are linking against the DLL
* version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW
@@ -230,13 +262,12 @@ extern "C" {
/* We are building GLFW as a Win32 DLL */
#define GLFWAPI __declspec(dllexport)
#elif defined(_WIN32) && defined(GLFW_DLL)
- /* We are calling GLFW as a Win32 DLL */
+ /* We are calling a GLFW Win32 DLL */
#define GLFWAPI __declspec(dllimport)
#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL)
- /* We are building GLFW as a shared / dynamic library */
+ /* We are building GLFW as a Unix shared library */
#define GLFWAPI __attribute__((visibility("default")))
#else
- /* We are building or calling GLFW as a static library */
#define GLFWAPI
#endif
@@ -247,45 +278,47 @@ extern "C" {
/*! @name GLFW version macros
* @{ */
-/*! @brief The major version number of the GLFW library.
+/*! @brief The major version number of the GLFW header.
*
- * This is incremented when the API is changed in non-compatible ways.
+ * The major version number of the GLFW header. This is incremented when the
+ * API is changed in non-compatible ways.
* @ingroup init
*/
#define GLFW_VERSION_MAJOR 3
-/*! @brief The minor version number of the GLFW library.
+/*! @brief The minor version number of the GLFW header.
*
- * This is incremented when features are added to the API but it remains
- * backward-compatible.
+ * The minor version number of the GLFW header. This is incremented when
+ * features are added to the API but it remains backward-compatible.
* @ingroup init
*/
#define GLFW_VERSION_MINOR 3
-/*! @brief The revision number of the GLFW library.
+/*! @brief The revision number of the GLFW header.
*
- * This is incremented when a bug fix release is made that does not contain any
- * API changes.
+ * The revision number of the GLFW header. This is incremented when a bug fix
+ * release is made that does not contain any API changes.
* @ingroup init
*/
-#define GLFW_VERSION_REVISION 0
+#define GLFW_VERSION_REVISION 8
/*! @} */
-/*! @name Boolean values
- * @{ */
/*! @brief One.
*
- * One. Seriously. You don't _need_ to use this symbol in your code. It's
- * semantic sugar for the number 1. You can also use `1` or `true` or `_True`
- * or `GL_TRUE` or whatever you want.
+ * This is only semantic sugar for the number 1. You can instead use `1` or
+ * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal
+ * to one.
+ *
+ * @ingroup init
*/
#define GLFW_TRUE 1
/*! @brief Zero.
*
- * Zero. Seriously. You don't _need_ to use this symbol in your code. It's
- * semantic sugar for the number 0. You can also use `0` or `false` or
- * `_False` or `GL_FALSE` or whatever you want.
+ * This is only semantic sugar for the number 0. You can instead use `0` or
+ * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is
+ * equal to zero.
+ *
+ * @ingroup init
*/
#define GLFW_FALSE 0
-/*! @} */
/*! @name Key and button actions
* @{ */
@@ -313,6 +346,7 @@ extern "C" {
/*! @} */
/*! @defgroup hat_state Joystick hat states
+ * @brief Joystick hat states.
*
* See [joystick hat input](@ref joystick_hat) for how these are used.
*
@@ -915,70 +949,87 @@ extern "C" {
#define GLFW_CLIENT_API 0x00022001
/*! @brief Context client API major version hint and attribute.
*
- * Context client API major version [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint)
+ * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib).
*/
#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002
/*! @brief Context client API minor version hint and attribute.
*
- * Context client API minor version [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint)
+ * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib).
*/
#define GLFW_CONTEXT_VERSION_MINOR 0x00022003
-/*! @brief Context client API revision number hint and attribute.
+/*! @brief Context client API revision number attribute.
*
- * Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context client API revision number
+ * [attribute](@ref GLFW_CONTEXT_REVISION_attrib).
*/
#define GLFW_CONTEXT_REVISION 0x00022004
/*! @brief Context robustness hint and attribute.
*
- * Context client API revision number [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint)
+ * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib).
*/
#define GLFW_CONTEXT_ROBUSTNESS 0x00022005
/*! @brief OpenGL forward-compatibility hint and attribute.
*
- * OpenGL forward-compatibility [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint)
+ * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib).
*/
#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006
-/*! @brief OpenGL debug context hint and attribute.
+/*! @brief Debug mode context hint and attribute.
*
- * OpenGL debug context [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and
+ * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib).
*/
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007
/*! @brief OpenGL profile hint and attribute.
*
- * OpenGL profile [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and
+ * [attribute](@ref GLFW_OPENGL_PROFILE_attrib).
*/
#define GLFW_OPENGL_PROFILE 0x00022008
/*! @brief Context flush-on-release hint and attribute.
*
- * Context flush-on-release [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and
+ * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib).
*/
#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009
/*! @brief Context error suppression hint and attribute.
*
- * Context error suppression [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and
+ * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib).
*/
#define GLFW_CONTEXT_NO_ERROR 0x0002200A
/*! @brief Context creation API hint and attribute.
*
- * Context creation API [hint](@ref GLFW_CLIENT_API_hint) and
- * [attribute](@ref GLFW_CLIENT_API_attrib).
+ * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and
+ * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib).
*/
#define GLFW_CONTEXT_CREATION_API 0x0002200B
-
+/*! @brief Window content area scaling window
+ * [window hint](@ref GLFW_SCALE_TO_MONITOR).
+ */
+#define GLFW_SCALE_TO_MONITOR 0x0002200C
+/*! @brief macOS specific
+ * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint).
+ */
#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001
+/*! @brief macOS specific
+ * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint).
+ */
#define GLFW_COCOA_FRAME_NAME 0x00023002
+/*! @brief macOS specific
+ * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint).
+ */
#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003
-
+/*! @brief X11 specific
+ * [window hint](@ref GLFW_X11_CLASS_NAME_hint).
+ */
#define GLFW_X11_CLASS_NAME 0x00024001
+/*! @brief X11 specific
+ * [window hint](@ref GLFW_X11_CLASS_NAME_hint).
+ */
#define GLFW_X11_INSTANCE_NAME 0x00024002
/*! @} */
@@ -998,6 +1049,7 @@ extern "C" {
#define GLFW_STICKY_KEYS 0x00033002
#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003
#define GLFW_LOCK_KEY_MODS 0x00033004
+#define GLFW_RAW_MOUSE_MOTION 0x00033005
#define GLFW_CURSOR_NORMAL 0x00034001
#define GLFW_CURSOR_HIDDEN 0x00034002
@@ -1056,9 +1108,20 @@ extern "C" {
/*! @addtogroup init
* @{ */
+/*! @brief Joystick hat buttons init hint.
+ *
+ * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS).
+ */
#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001
-
+/*! @brief macOS specific init hint.
+ *
+ * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint).
+ */
#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001
+/*! @brief macOS specific init hint.
+ *
+ * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint).
+ */
#define GLFW_COCOA_MENUBAR 0x00051002
/*! @} */
@@ -1129,17 +1192,25 @@ typedef struct GLFWwindow GLFWwindow;
*
* @since Added in version 3.1.
*
- * @ingroup cursor
+ * @ingroup input
*/
typedef struct GLFWcursor GLFWcursor;
-/*! @brief The function signature for error callbacks.
+/*! @brief The function pointer type for error callbacks.
*
- * This is the function signature for error callback functions.
+ * This is the function pointer type for error callbacks. An error callback
+ * function has the following signature:
+ * @code
+ * void callback_name(int error_code, const char* description)
+ * @endcode
*
- * @param[in] error An [error code](@ref errors).
+ * @param[in] error_code An [error code](@ref errors). Future releases may add
+ * more error codes.
* @param[in] description A UTF-8 encoded string describing the error.
*
+ * @pointer_lifetime The error description string is valid until the callback
+ * function returns.
+ *
* @sa @ref error_handling
* @sa @ref glfwSetErrorCallback
*
@@ -1147,17 +1218,21 @@ typedef struct GLFWcursor GLFWcursor;
*
* @ingroup init
*/
-typedef void (* GLFWerrorfun)(int,const char*);
+typedef void (* GLFWerrorfun)(int error_code, const char* description);
-/*! @brief The function signature for window position callbacks.
+/*! @brief The function pointer type for window position callbacks.
*
- * This is the function signature for window position callback functions.
+ * This is the function pointer type for window position callbacks. A window
+ * position callback function has the following signature:
+ * @code
+ * void callback_name(GLFWwindow* window, int xpos, int ypos)
+ * @endcode
*
* @param[in] window The window that was moved.
* @param[in] xpos The new x-coordinate, in screen coordinates, of the
- * upper-left corner of the client area of the window.
+ * upper-left corner of the content area of the window.
* @param[in] ypos The new y-coordinate, in screen coordinates, of the
- * upper-left corner of the client area of the window.
+ * upper-left corner of the content area of the window.
*
* @sa @ref window_pos
* @sa @ref glfwSetWindowPosCallback
@@ -1166,11 +1241,15 @@ typedef void (* GLFWerrorfun)(int,const char*);
*
* @ingroup window
*/
-typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);
+typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos);
-/*! @brief The function signature for window resize callbacks.
+/*! @brief The function pointer type for window size callbacks.
*
- * This is the function signature for window size callback functions.
+ * This is the function pointer type for window size callbacks. A window size
+ * callback function has the following signature:
+ * @code
+ * void callback_name(GLFWwindow* window, int width, int height)
+ * @endcode
*
* @param[in] window The window that was resized.
* @param[in] width The new width, in screen coordinates, of the window.
@@ -1184,11 +1263,15 @@ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);
*
* @ingroup window
*/
-typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);
+typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height);
-/*! @brief The function signature for window close callbacks.
+/*! @brief The function pointer type for window close callbacks.
*
- * This is the function signature for window close callback functions.
+ * This is the function pointer type for window close callbacks. A window
+ * close callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window)
+ * @endcode
*
* @param[in] window The window that the user attempted to close.
*
@@ -1200,11 +1283,15 @@ typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);
*
* @ingroup window
*/
-typedef void (* GLFWwindowclosefun)(GLFWwindow*);
+typedef void (* GLFWwindowclosefun)(GLFWwindow* window);
-/*! @brief The function signature for window content refresh callbacks.
+/*! @brief The function pointer type for window content refresh callbacks.
*
- * This is the function signature for window refresh callback functions.
+ * This is the function pointer type for window content refresh callbacks.
+ * A window content refresh callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window);
+ * @endcode
*
* @param[in] window The window whose content needs to be refreshed.
*
@@ -1216,11 +1303,15 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*);
*
* @ingroup window
*/
-typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
+typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window);
-/*! @brief The function signature for window focus/defocus callbacks.
+/*! @brief The function pointer type for window focus callbacks.
*
- * This is the function signature for window focus callback functions.
+ * This is the function pointer type for window focus callbacks. A window
+ * focus callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int focused)
+ * @endcode
*
* @param[in] window The window that gained or lost input focus.
* @param[in] focused `GLFW_TRUE` if the window was given input focus, or
@@ -1233,12 +1324,15 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
*
* @ingroup window
*/
-typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
+typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused);
-/*! @brief The function signature for window iconify/restore callbacks.
+/*! @brief The function pointer type for window iconify callbacks.
*
- * This is the function signature for window iconify/restore callback
- * functions.
+ * This is the function pointer type for window iconify callbacks. A window
+ * iconify callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int iconified)
+ * @endcode
*
* @param[in] window The window that was iconified or restored.
* @param[in] iconified `GLFW_TRUE` if the window was iconified, or
@@ -1251,15 +1345,18 @@ typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
*
* @ingroup window
*/
-typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);
+typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified);
-/*! @brief The function signature for window maximize/restore callbacks.
+/*! @brief The function pointer type for window maximize callbacks.
*
- * This is the function signature for window maximize/restore callback
- * functions.
+ * This is the function pointer type for window maximize callbacks. A window
+ * maximize callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int maximized)
+ * @endcode
*
* @param[in] window The window that was maximized or restored.
- * @param[in] iconified `GLFW_TRUE` if the window was maximized, or
+ * @param[in] maximized `GLFW_TRUE` if the window was maximized, or
* `GLFW_FALSE` if it was restored.
*
* @sa @ref window_maximize
@@ -1269,12 +1366,15 @@ typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);
*
* @ingroup window
*/
-typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int);
+typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized);
-/*! @brief The function signature for framebuffer resize callbacks.
+/*! @brief The function pointer type for framebuffer size callbacks.
*
- * This is the function signature for framebuffer resize callback
- * functions.
+ * This is the function pointer type for framebuffer size callbacks.
+ * A framebuffer size callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int width, int height)
+ * @endcode
*
* @param[in] window The window whose framebuffer was resized.
* @param[in] width The new width, in pixels, of the framebuffer.
@@ -1287,12 +1387,15 @@ typedef void (* GLFWwindowmaximizefun)(GLFWwindow*,int);
*
* @ingroup window
*/
-typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);
+typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height);
-/*! @brief The function signature for window content scale callbacks.
+/*! @brief The function pointer type for window content scale callbacks.
*
- * This is the function signature for window content scale callback
- * functions.
+ * This is the function pointer type for window content scale callbacks.
+ * A window content scale callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, float xscale, float yscale)
+ * @endcode
*
* @param[in] window The window whose content scale changed.
* @param[in] xscale The new x-axis content scale of the window.
@@ -1305,16 +1408,21 @@ typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);
*
* @ingroup window
*/
-typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float);
+typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale);
-/*! @brief The function signature for mouse button callbacks.
+/*! @brief The function pointer type for mouse button callbacks.
*
- * This is the function signature for mouse button callback functions.
+ * This is the function pointer type for mouse button callback functions.
+ * A mouse button callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int button, int action, int mods)
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] button The [mouse button](@ref buttons) that was pressed or
* released.
- * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`.
+ * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases
+ * may add more actions.
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
* held down.
*
@@ -1326,17 +1434,21 @@ typedef void (* GLFWwindowcontentscalefun)(GLFWwindow*,float,float);
*
* @ingroup input
*/
-typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
+typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods);
-/*! @brief The function signature for cursor position callbacks.
+/*! @brief The function pointer type for cursor position callbacks.
*
- * This is the function signature for cursor position callback functions.
+ * This is the function pointer type for cursor position callbacks. A cursor
+ * position callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, double xpos, double ypos);
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] xpos The new cursor x-coordinate, relative to the left edge of
- * the client area.
+ * the content area.
* @param[in] ypos The new cursor y-coordinate, relative to the top edge of the
- * client area.
+ * content area.
*
* @sa @ref cursor_pos
* @sa @ref glfwSetCursorPosCallback
@@ -1345,14 +1457,18 @@ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
*
* @ingroup input
*/
-typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
+typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos);
-/*! @brief The function signature for cursor enter/leave callbacks.
+/*! @brief The function pointer type for cursor enter/leave callbacks.
*
- * This is the function signature for cursor enter/leave callback functions.
+ * This is the function pointer type for cursor enter/leave callbacks.
+ * A cursor enter/leave callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int entered)
+ * @endcode
*
* @param[in] window The window that received the event.
- * @param[in] entered `GLFW_TRUE` if the cursor entered the window's client
+ * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content
* area, or `GLFW_FALSE` if it left it.
*
* @sa @ref cursor_enter
@@ -1362,11 +1478,15 @@ typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
*
* @ingroup input
*/
-typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
+typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered);
-/*! @brief The function signature for scroll callbacks.
+/*! @brief The function pointer type for scroll callbacks.
*
- * This is the function signature for scroll callback functions.
+ * This is the function pointer type for scroll callbacks. A scroll callback
+ * function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, double xoffset, double yoffset)
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] xoffset The scroll offset along the x-axis.
@@ -1379,16 +1499,21 @@ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
*
* @ingroup input
*/
-typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
+typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset);
-/*! @brief The function signature for keyboard key callbacks.
+/*! @brief The function pointer type for keyboard key callbacks.
*
- * This is the function signature for keyboard key callback functions.
+ * This is the function pointer type for keyboard key callbacks. A keyboard
+ * key callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods)
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] key The [keyboard key](@ref keys) that was pressed or released.
* @param[in] scancode The system-specific scancode of the key.
- * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`.
+ * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future
+ * releases may add more actions.
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
* held down.
*
@@ -1400,11 +1525,15 @@ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
*
* @ingroup input
*/
-typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
+typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods);
-/*! @brief The function signature for Unicode character callbacks.
+/*! @brief The function pointer type for Unicode character callbacks.
*
- * This is the function signature for Unicode character callback functions.
+ * This is the function pointer type for Unicode character callbacks.
+ * A Unicode character callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, unsigned int codepoint)
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] codepoint The Unicode code point of the character.
@@ -1417,14 +1546,18 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
*
* @ingroup input
*/
-typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
+typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint);
-/*! @brief The function signature for Unicode character with modifiers
+/*! @brief The function pointer type for Unicode character with modifiers
* callbacks.
*
- * This is the function signature for Unicode character with modifiers callback
- * functions. It is called for each input character, regardless of what
- * modifier keys are held down.
+ * This is the function pointer type for Unicode character with modifiers
+ * callbacks. It is called for each input character, regardless of what
+ * modifier keys are held down. A Unicode character with modifiers callback
+ * function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, unsigned int codepoint, int mods)
+ * @endcode
*
* @param[in] window The window that received the event.
* @param[in] codepoint The Unicode code point of the character.
@@ -1440,16 +1573,23 @@ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
*
* @ingroup input
*/
-typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
+typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods);
-/*! @brief The function signature for file drop callbacks.
+/*! @brief The function pointer type for path drop callbacks.
*
- * This is the function signature for file drop callbacks.
+ * This is the function pointer type for path drop callbacks. A path drop
+ * callback function has the following signature:
+ * @code
+ * void function_name(GLFWwindow* window, int path_count, const char* paths[])
+ * @endcode
*
* @param[in] window The window that received the event.
- * @param[in] count The number of dropped files.
+ * @param[in] path_count The number of dropped paths.
* @param[in] paths The UTF-8 encoded file and/or directory path names.
*
+ * @pointer_lifetime The path array and its strings are valid until the
+ * callback function returns.
+ *
* @sa @ref path_drop
* @sa @ref glfwSetDropCallback
*
@@ -1457,15 +1597,19 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
*
* @ingroup input
*/
-typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);
+typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]);
-/*! @brief The function signature for monitor configuration callbacks.
+/*! @brief The function pointer type for monitor configuration callbacks.
*
- * This is the function signature for monitor configuration callback functions.
+ * This is the function pointer type for monitor configuration callbacks.
+ * A monitor callback function has the following signature:
+ * @code
+ * void function_name(GLFWmonitor* monitor, int event)
+ * @endcode
*
* @param[in] monitor The monitor that was connected or disconnected.
- * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Remaining
- * values reserved for future use.
+ * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future
+ * releases may add more events.
*
* @sa @ref monitor_event
* @sa @ref glfwSetMonitorCallback
@@ -1474,16 +1618,19 @@ typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);
*
* @ingroup monitor
*/
-typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
+typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event);
-/*! @brief The function signature for joystick configuration callbacks.
+/*! @brief The function pointer type for joystick configuration callbacks.
*
- * This is the function signature for joystick configuration callback
- * functions.
+ * This is the function pointer type for joystick configuration callbacks.
+ * A joystick configuration callback function has the following signature:
+ * @code
+ * void function_name(int jid, int event)
+ * @endcode
*
* @param[in] jid The joystick that was connected or disconnected.
- * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Remaining
- * values reserved for future use.
+ * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future
+ * releases may add more events.
*
* @sa @ref joystick_event
* @sa @ref glfwSetJoystickCallback
@@ -1492,7 +1639,7 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
*
* @ingroup input
*/
-typedef void (* GLFWjoystickfun)(int,int);
+typedef void (* GLFWjoystickfun)(int jid, int event);
/*! @brief Video mode type.
*
@@ -1567,6 +1714,8 @@ typedef struct GLFWgammaramp
*
* @since Added in version 2.1.
* @glfw3 Removed format and bytes-per-pixel members.
+ *
+ * @ingroup window
*/
typedef struct GLFWimage
{
@@ -1589,6 +1738,8 @@ typedef struct GLFWimage
* @sa @ref glfwGetGamepadState
*
* @since Added in version 3.3.
+ *
+ * @ingroup input
*/
typedef struct GLFWgamepadstate
{
@@ -1630,6 +1781,10 @@ typedef struct GLFWgamepadstate
* bundle, if present. This can be disabled with the @ref
* GLFW_COCOA_CHDIR_RESOURCES init hint.
*
+ * @remark @x11 This function will set the `LC_CTYPE` category of the
+ * application locale according to the current environment if that category is
+ * still "C". This is because the "C" locale breaks Unicode text input.
+ *
* @thread_safety This function must only be called from the main thread.
*
* @sa @ref intro_init
@@ -1653,6 +1808,8 @@ GLFWAPI int glfwInit(void);
* call this function, as it is called by @ref glfwInit before it returns
* failure.
*
+ * This function has no effect if GLFW is not initialized.
+ *
* @errors Possible errors include @ref GLFW_PLATFORM_ERROR.
*
* @remark This function may be called before @ref glfwInit.
@@ -1814,10 +1971,17 @@ GLFWAPI int glfwGetError(const char** description);
* Once set, the error callback remains set even after the library has been
* terminated.
*
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set.
*
+ * @callback_signature
+ * @code
+ * void callback_name(int error_code, const char* description)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [callback pointer type](@ref GLFWerrorfun).
+ *
* @errors None.
*
* @remark This function may be called before @ref glfwInit.
@@ -1831,7 +1995,7 @@ GLFWAPI int glfwGetError(const char** description);
*
* @ingroup init
*/
-GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun);
+GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback);
/*! @brief Returns the currently connected monitors.
*
@@ -1911,6 +2075,37 @@ GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void);
*/
GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos);
+/*! @brief Retrieves the work area of the monitor.
+ *
+ * This function returns the position, in screen coordinates, of the upper-left
+ * corner of the work area of the specified monitor along with the work area
+ * size in screen coordinates. The work area is defined as the area of the
+ * monitor not occluded by the operating system task bar where present. If no
+ * task bar exists then the work area is the monitor resolution in screen
+ * coordinates.
+ *
+ * Any or all of the position and size arguments may be `NULL`. If an error
+ * occurs, all non-`NULL` position and size arguments will be set to zero.
+ *
+ * @param[in] monitor The monitor to query.
+ * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`.
+ * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`.
+ * @param[out] width Where to store the monitor width, or `NULL`.
+ * @param[out] height Where to store the monitor height, or `NULL`.
+ *
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
+ * GLFW_PLATFORM_ERROR.
+ *
+ * @thread_safety This function must only be called from the main thread.
+ *
+ * @sa @ref monitor_workarea
+ *
+ * @since Added in version 3.3.
+ *
+ * @ingroup monitor
+ */
+GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);
+
/*! @brief Returns the physical size of the monitor.
*
* This function returns the size, in millimetres, of the display area of the
@@ -1932,8 +2127,8 @@ GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos);
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
- * @remark @win32 calculates the returned physical size from the
- * current resolution and system DPI instead of querying the monitor EDID data.
+ * @remark @win32 On Windows 8 and earlier the physical size is calculated from
+ * the current resolution and system DPI instead of querying the monitor EDID data.
*
* @thread_safety This function must only be called from the main thread.
*
@@ -1949,9 +2144,11 @@ GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int*
*
* This function retrieves the content scale for the specified monitor. The
* content scale is the ratio between the current DPI and the platform's
- * default DPI. If you scale all pixel dimensions by this scale then your
- * content should appear at an appropriate size. This is especially important
- * for text and any UI elements.
+ * default DPI. This is especially important for text and any UI elements. If
+ * the pixel dimensions of your UI scaled by this look appropriate on your
+ * machine then it should appear at a reasonable size on other machines
+ * regardless of their DPI and scaling settings. This relies on the system DPI
+ * and scaling settings being somewhat correct.
*
* The content scale may depend on both the monitor resolution and pixel
* density and on user settings. It may be very different from the raw DPI
@@ -2057,11 +2254,18 @@ GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor);
* currently set callback. This is called when a monitor is connected to or
* disconnected from the system.
*
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWmonitor* monitor, int event)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWmonitorfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -2072,14 +2276,15 @@ GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor);
*
* @ingroup monitor
*/
-GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun);
+GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback);
/*! @brief Returns the available video modes for the specified monitor.
*
* This function returns an array of all video modes supported by the specified
* monitor. The returned array is sorted in ascending order, first by color
- * bit depth (the sum of all channel depths) and then by resolution area (the
- * product of width and height).
+ * bit depth (the sum of all channel depths), then by resolution area (the
+ * product of width and height), then resolution width and finally by refresh
+ * rate.
*
* @param[in] monitor The monitor to query.
* @param[out] count Where to store the number of video modes in the returned
@@ -2137,9 +2342,9 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);
/*! @brief Generates a gamma ramp and sets it for the specified monitor.
*
- * This function generates a 256-element gamma ramp from the specified exponent
- * and then calls @ref glfwSetGammaRamp with it. The value must be a finite
- * number greater than zero.
+ * This function generates an appropriately sized gamma ramp from the specified
+ * exponent and then calls @ref glfwSetGammaRamp with it. The value must be
+ * a finite number greater than zero.
*
* The software controlled gamma ramp is applied _in addition_ to the hardware
* gamma correction, which today is usually an approximation of sRGB gamma.
@@ -2155,7 +2360,7 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
* GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.
*
- * @remark @wayland Gamma handling is a priviledged protocol, this function
+ * @remark @wayland Gamma handling is a privileged protocol, this function
* will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR.
*
* @thread_safety This function must only be called from the main thread.
@@ -2179,7 +2384,7 @@ GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
- * @remark @wayland Gamma handling is a priviledged protocol, this function
+ * @remark @wayland Gamma handling is a privileged protocol, this function
* will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while
* returning `NULL`.
*
@@ -2218,12 +2423,12 @@ GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
- * @remark Gamma ramp sizes other than 256 are not supported by all platforms
- * or graphics hardware.
+ * @remark The size of the specified gamma ramp should match the size of the
+ * current ramp for that monitor.
*
* @remark @win32 The gamma ramp size must be 256.
*
- * @remark @wayland Gamma handling is a priviledged protocol, this function
+ * @remark @wayland Gamma handling is a privileged protocol, this function
* will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR.
*
* @pointer_lifetime The specified gamma ramp is copied before this function
@@ -2442,7 +2647,7 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
*
* @remark @macos When activating frame autosaving with
* [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified
- * window size and position may be overriden by previously saved values.
+ * window size and position may be overridden by previously saved values.
*
* @remark @x11 Some window managers will not respect the placement of
* initially hidden windows.
@@ -2455,15 +2660,18 @@ GLFWAPI void glfwWindowHintString(int hint, const char* value);
* @remark @x11 The class part of the `WM_CLASS` window property will by
* default be set to the window title passed to this function. The instance
* part will use the contents of the `RESOURCE_NAME` environment variable, if
- * present and not empty, or fall back to the window title. Set the @ref
- * GLFW_X11_CLASS_NAME and @ref GLFW_X11_INSTANCE_NAME window hints to override
- * this.
- *
- * @remark @wayland The window frame is currently very simple, only allowing
- * window resize or move. A compositor can still emit close, maximize or
- * fullscreen events, using for example a keybind mechanism. Additionally,
- * the wp_viewporter protocol is required for this feature, otherwise the
- * window will not be decorated.
+ * present and not empty, or fall back to the window title. Set the
+ * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and
+ * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to
+ * override this.
+ *
+ * @remark @wayland Compositors should implement the xdg-decoration protocol
+ * for GLFW to decorate the window properly. If this protocol isn't
+ * supported, or if the compositor prefers client-side decorations, a very
+ * simple fallback frame will be drawn using the wp_viewporter protocol. A
+ * compositor can still emit close, maximize or fullscreen events, using for
+ * instance a keybind mechanism. If neither of these protocols is supported,
+ * the window won't be decorated.
*
* @remark @wayland A full screen window will not attempt to change the mode,
* no matter what the requested size or refresh rate.
@@ -2599,8 +2807,8 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);
* @param[in] images The images to create the icon from. This is ignored if
* count is zero.
*
- * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
- * GLFW_PLATFORM_ERROR.
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
+ * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.
*
* @pointer_lifetime The specified image data is copied before this function
* returns.
@@ -2625,19 +2833,19 @@ GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title);
*/
GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images);
-/*! @brief Retrieves the position of the client area of the specified window.
+/*! @brief Retrieves the position of the content area of the specified window.
*
* This function retrieves the position, in screen coordinates, of the
- * upper-left corner of the client area of the specified window.
+ * upper-left corner of the content area of the specified window.
*
* Any or all of the position arguments may be `NULL`. If an error occurs, all
* non-`NULL` position arguments will be set to zero.
*
* @param[in] window The window to query.
* @param[out] xpos Where to store the x-coordinate of the upper-left corner of
- * the client area, or `NULL`.
+ * the content area, or `NULL`.
* @param[out] ypos Where to store the y-coordinate of the upper-left corner of
- * the client area, or `NULL`.
+ * the content area, or `NULL`.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -2657,10 +2865,10 @@ GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* i
*/
GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
-/*! @brief Sets the position of the client area of the specified window.
+/*! @brief Sets the position of the content area of the specified window.
*
* This function sets the position, in screen coordinates, of the upper-left
- * corner of the client area of the specified windowed mode window. If the
+ * corner of the content area of the specified windowed mode window. If the
* window is a full screen window, this function does nothing.
*
* __Do not use this function__ to move an already visible window unless you
@@ -2670,8 +2878,8 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
* cannot and should not override these limits.
*
* @param[in] window The window to query.
- * @param[in] xpos The x-coordinate of the upper-left corner of the client area.
- * @param[in] ypos The y-coordinate of the upper-left corner of the client area.
+ * @param[in] xpos The x-coordinate of the upper-left corner of the content area.
+ * @param[in] ypos The y-coordinate of the upper-left corner of the content area.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -2692,9 +2900,9 @@ GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos);
*/
GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
-/*! @brief Retrieves the size of the client area of the specified window.
+/*! @brief Retrieves the size of the content area of the specified window.
*
- * This function retrieves the size, in screen coordinates, of the client area
+ * This function retrieves the size, in screen coordinates, of the content area
* of the specified window. If you wish to retrieve the size of the
* framebuffer of the window in pixels, see @ref glfwGetFramebufferSize.
*
@@ -2703,9 +2911,9 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
*
* @param[in] window The window whose size to retrieve.
* @param[out] width Where to store the width, in screen coordinates, of the
- * client area, or `NULL`.
+ * content area, or `NULL`.
* @param[out] height Where to store the height, in screen coordinates, of the
- * client area, or `NULL`.
+ * content area, or `NULL`.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -2724,7 +2932,7 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
/*! @brief Sets the size limits of the specified window.
*
- * This function sets the size limits of the client area of the specified
+ * This function sets the size limits of the content area of the specified
* window. If the window is full screen, the size limits only take effect
* once it is made windowed. If the window is not resizable, this function
* does nothing.
@@ -2736,14 +2944,14 @@ GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
* dimensions and all must be greater than or equal to zero.
*
* @param[in] window The window to set limits for.
- * @param[in] minwidth The minimum width, in screen coordinates, of the client
+ * @param[in] minwidth The minimum width, in screen coordinates, of the content
* area, or `GLFW_DONT_CARE`.
* @param[in] minheight The minimum height, in screen coordinates, of the
- * client area, or `GLFW_DONT_CARE`.
- * @param[in] maxwidth The maximum width, in screen coordinates, of the client
+ * content area, or `GLFW_DONT_CARE`.
+ * @param[in] maxwidth The maximum width, in screen coordinates, of the content
* area, or `GLFW_DONT_CARE`.
* @param[in] maxheight The maximum height, in screen coordinates, of the
- * client area, or `GLFW_DONT_CARE`.
+ * content area, or `GLFW_DONT_CARE`.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
* GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.
@@ -2767,7 +2975,7 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minhe
/*! @brief Sets the aspect ratio of the specified window.
*
- * This function sets the required aspect ratio of the client area of the
+ * This function sets the required aspect ratio of the content area of the
* specified window. If the window is full screen, the aspect ratio only takes
* effect once it is made windowed. If the window is not resizable, this
* function does nothing.
@@ -2808,9 +3016,9 @@ GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minhe
*/
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
-/*! @brief Sets the size of the client area of the specified window.
+/*! @brief Sets the size of the content area of the specified window.
*
- * This function sets the size, in screen coordinates, of the client area of
+ * This function sets the size, in screen coordinates, of the content area of
* the specified window.
*
* For full screen windows, this function updates the resolution of its desired
@@ -2826,9 +3034,9 @@ GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
*
* @param[in] window The window to resize.
* @param[in] width The desired width, in screen coordinates, of the window
- * client area.
+ * content area.
* @param[in] height The desired height, in screen coordinates, of the window
- * client area.
+ * content area.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -2919,9 +3127,11 @@ GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int
*
* This function retrieves the content scale for the specified window. The
* content scale is the ratio between the current DPI and the platform's
- * default DPI. If you scale all pixel dimensions by this scale then your
- * content should appear at an appropriate size. This is especially important
- * for text and any UI elements.
+ * default DPI. This is especially important for text and any UI elements. If
+ * the pixel dimensions of your UI scaled by this look appropriate on your
+ * machine then it should appear at a reasonable size on other machines
+ * regardless of their DPI and scaling settings. This relies on the system DPI
+ * and scaling settings being somewhat correct.
*
* On systems where each monitors can have its own content scale, the window
* content scale will depend on which monitor the system considers the window
@@ -3008,18 +3218,15 @@ GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity);
* previously restored. If the window is already iconified, this function does
* nothing.
*
- * If the specified window is a full screen window, the original monitor
- * resolution is restored until the window is restored.
+ * If the specified window is a full screen window, GLFW restores the original
+ * video mode of the monitor. The window's desired video mode is set again
+ * when the window is restored.
*
* @param[in] window The window to iconify.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
- * @remark @wayland There is no concept of iconification in wl_shell, this
- * function will emit @ref GLFW_PLATFORM_ERROR when using this deprecated
- * protocol.
- *
* @thread_safety This function must only be called from the main thread.
*
* @sa @ref window_iconify
@@ -3039,8 +3246,8 @@ GLFWAPI void glfwIconifyWindow(GLFWwindow* window);
* (minimized) or maximized. If the window is already restored, this function
* does nothing.
*
- * If the specified window is a full screen window, the resolution chosen for
- * the window is restored on the selected monitor.
+ * If the specified window is an iconified full screen window, its desired
+ * video mode is set again for its monitor when the window is restored.
*
* @param[in] window The window to restore.
*
@@ -3101,6 +3308,11 @@ GLFWAPI void glfwMaximizeWindow(GLFWwindow* window);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
+ * @remark @wayland Because Wayland wants every frame of the desktop to be
+ * complete, this function does not immediately make the window visible.
+ * Instead it will become visible the next time the window framebuffer is
+ * updated after this call.
+ *
* @thread_safety This function must only be called from the main thread.
*
* @sa @ref window_hide
@@ -3232,7 +3444,7 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);
* The window position is ignored when setting a monitor.
*
* When the monitor is `NULL`, the position, width and height are used to
- * place the window client area. The refresh rate is ignored when no monitor
+ * place the window content area. The refresh rate is ignored when no monitor
* is specified.
*
* If you only wish to update the resolution of a full screen window or the
@@ -3245,12 +3457,12 @@ GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window);
* @param[in] window The window whose monitor, size or video mode to set.
* @param[in] monitor The desired monitor, or `NULL` to set windowed mode.
* @param[in] xpos The desired x-coordinate of the upper-left corner of the
- * client area.
+ * content area.
* @param[in] ypos The desired y-coordinate of the upper-left corner of the
- * client area.
- * @param[in] width The desired with, in screen coordinates, of the client area
- * or video mode.
- * @param[in] height The desired height, in screen coordinates, of the client
+ * content area.
+ * @param[in] width The desired with, in screen coordinates, of the content
+ * area or video mode.
+ * @param[in] height The desired height, in screen coordinates, of the content
* area or video mode.
* @param[in] refreshRate The desired refresh rate, in Hz, of the video mode,
* or `GLFW_DONT_CARE`.
@@ -3303,6 +3515,9 @@ GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int
* errors. However, this function should not fail as long as it is passed
* valid arguments and the library has been [initialized](@ref intro_init).
*
+ * @remark @wayland The Wayland protocol provides no way to check whether a
+ * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`.
+ *
* @thread_safety This function must only be called from the main thread.
*
* @sa @ref window_attribs
@@ -3400,15 +3615,22 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window);
*
* This function sets the position callback of the specified window, which is
* called when the window is moved. The callback is provided with the
- * position, in screen coordinates, of the upper-left corner of the client area
- * of the window.
+ * position, in screen coordinates, of the upper-left corner of the content
+ * area of the window.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int xpos, int ypos)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowposfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @remark @wayland This callback will never be called, as there is no way for
@@ -3422,20 +3644,27 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window);
*
* @ingroup window
*/
-GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun);
+GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback);
/*! @brief Sets the size callback for the specified window.
*
* This function sets the size callback of the specified window, which is
* called when the window is resized. The callback is provided with the size,
- * in screen coordinates, of the client area of the window.
+ * in screen coordinates, of the content area of the window.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int width, int height)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowsizefun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3447,7 +3676,7 @@ GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindow
*
* @ingroup window
*/
-GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun);
+GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback);
/*! @brief Sets the close callback for the specified window.
*
@@ -3461,11 +3690,18 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
* The close callback is not triggered by @ref glfwDestroyWindow.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowclosefun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @remark @macos Selecting Quit from the application menu will trigger the
@@ -3480,12 +3716,12 @@ GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwind
*
* @ingroup window
*/
-GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun);
+GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback);
/*! @brief Sets the refresh callback for the specified window.
*
* This function sets the refresh callback of the specified window, which is
- * called when the client area of the window needs to be redrawn, for example
+ * called when the content area of the window needs to be redrawn, for example
* if the window has been exposed after having been covered by another window.
*
* On compositing window systems such as Aero, Compiz, Aqua or Wayland, where
@@ -3493,11 +3729,18 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwi
* very infrequently or never at all.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window);
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowrefreshfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3509,7 +3752,7 @@ GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwi
*
* @ingroup window
*/
-GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun);
+GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback);
/*! @brief Sets the focus callback for the specified window.
*
@@ -3522,11 +3765,18 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GL
* and @ref glfwSetMouseButtonCallback.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int focused)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowfocusfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3537,7 +3787,7 @@ GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GL
*
* @ingroup window
*/
-GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun);
+GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback);
/*! @brief Sets the iconify callback for the specified window.
*
@@ -3545,15 +3795,22 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi
* is called when the window is iconified or restored.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int iconified)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowiconifyfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
- * @remark @wayland The wl_shell protocol has no concept of iconification,
- * this callback will never be called when using this deprecated protocol.
+ * @remark @wayland The XDG-shell protocol has no event for iconification, so
+ * this callback will never be called.
*
* @thread_safety This function must only be called from the main thread.
*
@@ -3563,7 +3820,7 @@ GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwi
*
* @ingroup window
*/
-GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun);
+GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback);
/*! @brief Sets the maximize callback for the specified window.
*
@@ -3571,11 +3828,18 @@ GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GL
* is called when the window is maximized or restored.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int maximized)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowmaximizefun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3586,7 +3850,7 @@ GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GL
*
* @ingroup window
*/
-GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun cbfun);
+GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback);
/*! @brief Sets the framebuffer resize callback for the specified window.
*
@@ -3594,11 +3858,18 @@ GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window,
* which is called when the framebuffer of the specified window is resized.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int width, int height)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWframebuffersizefun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3609,7 +3880,7 @@ GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window,
*
* @ingroup window
*/
-GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun);
+GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback);
/*! @brief Sets the window content scale callback for the specified window.
*
@@ -3617,11 +3888,18 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window
* which is called when the content scale of the specified window changes.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, float xscale, float yscale)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWwindowcontentscalefun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -3633,7 +3911,7 @@ GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window
*
* @ingroup window
*/
-GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun cbfun);
+GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback);
/*! @brief Processes all pending events.
*
@@ -3699,10 +3977,6 @@ GLFWAPI void glfwPollEvents(void);
* GLFW will pass those events on to the application callbacks before
* returning.
*
- * If no windows exist, this function returns immediately. For synchronization
- * of threads in applications that do not create windows, use your threading
- * library of choice.
- *
* Event processing is not required for joystick input to work.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
@@ -3750,14 +4024,13 @@ GLFWAPI void glfwWaitEvents(void);
* GLFW will pass those events on to the application callbacks before
* returning.
*
- * If no windows exist, this function returns immediately. For synchronization
- * of threads in applications that do not create windows, use your threading
- * library of choice.
- *
* Event processing is not required for joystick input to work.
*
* @param[in] timeout The maximum amount of time, in seconds, to wait.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
+ * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.
+ *
* @reentrancy This function must not be called from a callback.
*
* @thread_safety This function must only be called from the main thread.
@@ -3777,10 +4050,6 @@ GLFWAPI void glfwWaitEventsTimeout(double timeout);
* This function posts an empty event from the current thread to the event
* queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return.
*
- * If no windows exist, this function returns immediately. For synchronization
- * of threads in applications that do not create windows, use your threading
- * library of choice.
- *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
@@ -3800,11 +4069,13 @@ GLFWAPI void glfwPostEmptyEvent(void);
*
* This function returns the value of an input option for the specified window.
* The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
- * @ref GLFW_STICKY_MOUSE_BUTTONS or @ref GLFW_LOCK_KEY_MODS.
+ * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or
+ * @ref GLFW_RAW_MOUSE_MOTION.
*
* @param[in] window The window to query.
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
- * `GLFW_STICKY_MOUSE_BUTTONS` or `GLFW_LOCK_KEY_MODS`.
+ * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
+ * `GLFW_RAW_MOUSE_MOTION`.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_INVALID_ENUM.
@@ -3823,13 +4094,14 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
*
* This function sets an input mode option for the specified window. The mode
* must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS,
- * @ref GLFW_STICKY_MOUSE_BUTTONS or @ref GLFW_LOCK_KEY_MODS.
+ * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or
+ * @ref GLFW_RAW_MOUSE_MOTION.
*
* If the mode is `GLFW_CURSOR`, the value must be one of the following cursor
* modes:
* - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally.
- * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client
- * area of the window but does not restrict the cursor from leaving.
+ * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the
+ * content area of the window but does not restrict the cursor from leaving.
* - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual
* and unlimited cursor movement. This is useful for implementing for
* example 3D camera controls.
@@ -3855,9 +4127,16 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
* GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on,
* and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on.
*
+ * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE`
+ * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is
+ * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported,
+ * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref
+ * glfwRawMouseMotionSupported to check for support.
+ *
* @param[in] window The window whose input mode to set.
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`,
- * `GLFW_STICKY_MOUSE_BUTTONS` or `GLFW_LOCK_KEY_MODS`.
+ * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or
+ * `GLFW_RAW_MOUSE_MOTION`.
* @param[in] value The new value of the specified input mode.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
@@ -3873,6 +4152,35 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
*/
GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);
+/*! @brief Returns whether raw mouse motion is supported.
+ *
+ * This function returns whether raw mouse motion is supported on the current
+ * system. This status does not change after GLFW has been initialized so you
+ * only need to check this once. If you attempt to enable raw motion on
+ * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted.
+ *
+ * Raw mouse motion is closer to the actual motion of the mouse across
+ * a surface. It is not affected by the scaling and acceleration applied to
+ * the motion of the desktop cursor. That processing is suitable for a cursor
+ * while raw motion is better for controlling for example a 3D camera. Because
+ * of this, raw mouse motion is only provided when the cursor is disabled.
+ *
+ * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine,
+ * or `GLFW_FALSE` otherwise.
+ *
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
+ * @thread_safety This function must only be called from the main thread.
+ *
+ * @sa @ref raw_mouse_motion
+ * @sa @ref glfwSetInputMode
+ *
+ * @since Added in version 3.3.
+ *
+ * @ingroup input
+ */
+GLFWAPI int glfwRawMouseMotionSupported(void);
+
/*! @brief Returns the layout-specific name of the specified printable key.
*
* This function returns the name of the specified printable key, encoded as
@@ -3925,9 +4233,11 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
+ * @remark The contents of the returned string may change when a keyboard
+ * layout change event is received.
+ *
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
- * should not free it yourself. It is valid until the next call to @ref
- * glfwGetKeyName, or until the library is terminated.
+ * should not free it yourself. It is valid until the library is terminated.
*
* @thread_safety This function must only be called from the main thread.
*
@@ -3968,8 +4278,7 @@ GLFWAPI int glfwGetKeyScancode(int key);
*
* This function returns the last state reported for the specified key to the
* specified window. The returned state is one of `GLFW_PRESS` or
- * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to
- * the key callback.
+ * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback.
*
* If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns
* `GLFW_PRESS` the first time you call it for a key that was pressed, even if
@@ -4011,8 +4320,8 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key);
* `GLFW_RELEASE`.
*
* If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function
- * `GLFW_PRESS` the first time you call it for a mouse button that was pressed,
- * even if that mouse button has already been released.
+ * returns `GLFW_PRESS` the first time you call it for a mouse button that was
+ * pressed, even if that mouse button has already been released.
*
* @param[in] window The desired window.
* @param[in] button The desired [mouse button](@ref buttons).
@@ -4032,11 +4341,11 @@ GLFWAPI int glfwGetKey(GLFWwindow* window, int key);
*/
GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
-/*! @brief Retrieves the position of the cursor relative to the client area of
+/*! @brief Retrieves the position of the cursor relative to the content area of
* the window.
*
* This function returns the position of the cursor, in screen coordinates,
- * relative to the upper-left corner of the client area of the specified
+ * relative to the upper-left corner of the content area of the specified
* window.
*
* If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor
@@ -4052,9 +4361,9 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
*
* @param[in] window The desired window.
* @param[out] xpos Where to store the cursor x-coordinate, relative to the
- * left edge of the client area, or `NULL`.
+ * left edge of the content area, or `NULL`.
* @param[out] ypos Where to store the cursor y-coordinate, relative to the to
- * top edge of the client area, or `NULL`.
+ * top edge of the content area, or `NULL`.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -4070,11 +4379,11 @@ GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button);
*/
GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
-/*! @brief Sets the position of the cursor, relative to the client area of the
+/*! @brief Sets the position of the cursor, relative to the content area of the
* window.
*
* This function sets the position, in screen coordinates, of the cursor
- * relative to the upper-left corner of the client area of the specified
+ * relative to the upper-left corner of the content area of the specified
* window. The window must have input focus. If the window does not have
* input focus when this function is called, it fails silently.
*
@@ -4089,9 +4398,9 @@ GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos);
*
* @param[in] window The desired window.
* @param[in] xpos The desired x-coordinate, relative to the left edge of the
- * client area.
+ * content area.
* @param[in] ypos The desired y-coordinate, relative to the top edge of the
- * client area.
+ * content area.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
@@ -4130,8 +4439,8 @@ GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos);
* @return The handle of the created cursor, or `NULL` if an
* [error](@ref error_handling) occurred.
*
- * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
- * GLFW_PLATFORM_ERROR.
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
+ * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR.
*
* @pointer_lifetime The specified image data is copied before this function
* returns.
@@ -4201,7 +4510,7 @@ GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor);
/*! @brief Sets the cursor for the window.
*
* This function sets the cursor image to be used when the cursor is over the
- * client area of the specified window. The set cursor will only be visible
+ * content area of the specified window. The set cursor will only be visible
* when the [cursor mode](@ref cursor_mode) of the window is
* `GLFW_CURSOR_NORMAL`.
*
@@ -4250,11 +4559,18 @@ GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
* scancode may be zero.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new key callback, or `NULL` to remove the currently
+ * @param[in] callback The new key callback, or `NULL` to remove the currently
* set callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWkeyfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4266,7 +4582,7 @@ GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
*
* @ingroup input
*/
-GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);
+GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback);
/*! @brief Sets the Unicode character callback.
*
@@ -4283,16 +4599,21 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);
* The character callback behaves as system text input normally does and will
* not be called if modifier keys are held down that would prevent normal text
* input on that platform, for example a Super (Command) key on macOS or Alt key
- * on Windows. There is a
- * [character with modifiers callback](@ref glfwSetCharModsCallback) that
- * receives these events.
+ * on Windows.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, unsigned int codepoint)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWcharfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4304,7 +4625,7 @@ GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);
*
* @ingroup input
*/
-GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);
+GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback);
/*! @brief Sets the Unicode character with modifiers callback.
*
@@ -4322,11 +4643,18 @@ GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);
* [key callback](@ref glfwSetKeyCallback) instead.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or an
* [error](@ref error_handling) occurred.
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, unsigned int codepoint, int mods)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWcharmodsfun).
+ *
* @deprecated Scheduled for removal in version 4.0.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
@@ -4339,7 +4667,7 @@ GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun);
*
* @ingroup input
*/
-GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun);
+GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback);
/*! @brief Sets the mouse button callback.
*
@@ -4353,11 +4681,18 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmods
* [window focus callback](@ref glfwSetWindowFocusCallback) has been called.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int button, int action, int mods)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWmousebuttonfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4369,21 +4704,28 @@ GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmods
*
* @ingroup input
*/
-GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun);
+GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback);
/*! @brief Sets the cursor position callback.
*
* This function sets the cursor position callback of the specified window,
* which is called when the cursor is moved. The callback is provided with the
* position, in screen coordinates, relative to the upper-left corner of the
- * client area of the window.
+ * content area of the window.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, double xpos, double ypos);
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWcursorposfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4394,20 +4736,27 @@ GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmo
*
* @ingroup input
*/
-GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun);
+GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback);
-/*! @brief Sets the cursor enter/exit callback.
+/*! @brief Sets the cursor enter/leave callback.
*
* This function sets the cursor boundary crossing callback of the specified
- * window, which is called when the cursor enters or leaves the client area of
+ * window, which is called when the cursor enters or leaves the content area of
* the window.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int entered)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWcursorenterfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4418,7 +4767,7 @@ GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursor
*
* @ingroup input
*/
-GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun);
+GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback);
/*! @brief Sets the scroll callback.
*
@@ -4430,11 +4779,18 @@ GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcu
* wheel or a touchpad scrolling area.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently
- * set callback.
+ * @param[in] callback The new scroll callback, or `NULL` to remove the
+ * currently set callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, double xoffset, double yoffset)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWscrollfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4445,12 +4801,12 @@ GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcu
*
* @ingroup input
*/
-GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun);
+GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback);
-/*! @brief Sets the file drop callback.
+/*! @brief Sets the path drop callback.
*
- * This function sets the file drop callback of the specified window, which is
- * called when one or more dragged files are dropped on the window.
+ * This function sets the path drop callback of the specified window, which is
+ * called when one or more dragged paths are dropped on the window.
*
* Because the path array and its strings may have been generated specifically
* for that event, they are not guaranteed to be valid after the callback has
@@ -4458,11 +4814,18 @@ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cb
* make a deep copy.
*
* @param[in] window The window whose callback to set.
- * @param[in] cbfun The new file drop callback, or `NULL` to remove the
+ * @param[in] callback The new file drop callback, or `NULL` to remove the
* currently set callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(GLFWwindow* window, int path_count, const char* paths[])
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWdropfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @remark @wayland File drop is currently unimplemented.
@@ -4475,7 +4838,7 @@ GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cb
*
* @ingroup input
*/
-GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun);
+GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback);
/*! @brief Returns whether the specified joystick is present.
*
@@ -4581,7 +4944,7 @@ GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count);
* Each element in the array is one of the following values:
*
* Name | Value
- * --------------------- | --------------------------------
+ * ---- | -----
* `GLFW_HAT_CENTERED` | 0
* `GLFW_HAT_UP` | 1
* `GLFW_HAT_RIGHT` | 2
@@ -4663,7 +5026,7 @@ GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count);
*/
GLFWAPI const char* glfwGetJoystickName(int jid);
-/*! @brief Returns the SDL comaptible GUID of the specified joystick.
+/*! @brief Returns the SDL compatible GUID of the specified joystick.
*
* This function returns the SDL compatible GUID, as a UTF-8 encoded
* hexadecimal string, of the specified joystick. The returned string is
@@ -4794,11 +5157,18 @@ GLFWAPI int glfwJoystickIsGamepad(int jid);
* called by joystick functions. The function will then return whatever it
* returns if the joystick is not present.
*
- * @param[in] cbfun The new callback, or `NULL` to remove the currently set
+ * @param[in] callback The new callback, or `NULL` to remove the currently set
* callback.
* @return The previously set callback, or `NULL` if no callback was set or the
* library had not been [initialized](@ref intro_init).
*
+ * @callback_signature
+ * @code
+ * void function_name(int jid, int event)
+ * @endcode
+ * For more information about the callback parameters, see the
+ * [function pointer type](@ref GLFWjoystickfun).
+ *
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function must only be called from the main thread.
@@ -4809,7 +5179,7 @@ GLFWAPI int glfwJoystickIsGamepad(int jid);
*
* @ingroup input
*/
-GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun);
+GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback);
/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings.
*
@@ -4860,6 +5230,8 @@ GLFWAPI int glfwUpdateGamepadMappings(const char* string);
* joystick is not present, does not have a mapping or an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM.
+ *
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
* should not free it yourself. It is valid until the specified joystick is
* disconnected, the gamepad mappings are updated or the library is terminated.
@@ -4877,7 +5249,7 @@ GLFWAPI const char* glfwGetGamepadName(int jid);
/*! @brief Retrieves the state of the specified joystick remapped as a gamepad.
*
- * This function retrives the state of the specified joystick remapped to
+ * This function retrieves the state of the specified joystick remapped to
* an Xbox-like gamepad.
*
* If the specified joystick is not present or does not have a gamepad mapping
@@ -4901,6 +5273,8 @@ GLFWAPI const char* glfwGetGamepadName(int jid);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_INVALID_ENUM.
*
+ * @thread_safety This function must only be called from the main thread.
+ *
* @sa @ref gamepad
* @sa @ref glfwUpdateGamepadMappings
* @sa @ref glfwJoystickIsGamepad
@@ -4922,8 +5296,6 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_PLATFORM_ERROR.
*
- * @remark @wayland Clipboard is currently unimplemented.
- *
* @pointer_lifetime The specified string is copied before this function
* returns.
*
@@ -4949,10 +5321,8 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);
* @return The contents of the clipboard as a UTF-8 encoded string, or `NULL`
* if an [error](@ref error_handling) occurred.
*
- * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
- * GLFW_PLATFORM_ERROR.
- *
- * @remark @wayland Clipboard is currently unimplemented.
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref
+ * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
*
* @pointer_lifetime The returned string is allocated and freed by GLFW. You
* should not free it yourself. It is valid until the next call to @ref
@@ -4970,23 +5340,26 @@ GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string);
*/
GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);
-/*! @brief Returns the value of the GLFW timer.
+/*! @brief Returns the GLFW time.
+ *
+ * This function returns the current GLFW time, in seconds. Unless the time
+ * has been set using @ref glfwSetTime it measures time elapsed since GLFW was
+ * initialized.
*
- * This function returns the value of the GLFW timer. Unless the timer has
- * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW
- * was initialized.
+ * This function and @ref glfwSetTime are helper functions on top of @ref
+ * glfwGetTimerFrequency and @ref glfwGetTimerValue.
*
* The resolution of the timer is system dependent, but is usually on the order
* of a few micro- or nanoseconds. It uses the highest-resolution monotonic
* time source on each supported platform.
*
- * @return The current value, in seconds, or zero if an
+ * @return The current time, in seconds, or zero if an
* [error](@ref error_handling) occurred.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function may be called from any thread. Reading and
- * writing of the internal timer offset is not atomic, so it needs to be
+ * writing of the internal base time is not atomic, so it needs to be
* externally synchronized with calls to @ref glfwSetTime.
*
* @sa @ref time
@@ -4997,23 +5370,26 @@ GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window);
*/
GLFWAPI double glfwGetTime(void);
-/*! @brief Sets the GLFW timer.
+/*! @brief Sets the GLFW time.
*
- * This function sets the value of the GLFW timer. It then continues to count
- * up from that value. The value must be a positive finite number less than
- * or equal to 18446744073.0, which is approximately 584.5 years.
+ * This function sets the current GLFW time, in seconds. The value must be
+ * a positive finite number less than or equal to 18446744073.0, which is
+ * approximately 584.5 years.
+ *
+ * This function and @ref glfwGetTime are helper functions on top of @ref
+ * glfwGetTimerFrequency and @ref glfwGetTimerValue.
*
* @param[in] time The new value, in seconds.
*
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
* GLFW_INVALID_VALUE.
*
- * @remark The upper limit of the timer is calculated as
+ * @remark The upper limit of GLFW time is calculated as
* floor((2<sup>64</sup> - 1) / 10<sup>9</sup>) and is due to implementations
* storing nanoseconds in 64 bits. The limit may be increased in the future.
*
* @thread_safety This function may be called from any thread. Reading and
- * writing of the internal timer offset is not atomic, so it needs to be
+ * writing of the internal base time is not atomic, so it needs to be
* externally synchronized with calls to @ref glfwGetTime.
*
* @sa @ref time
@@ -5290,13 +5666,11 @@ GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname);
* This function returns whether the Vulkan loader and any minimally functional
* ICD have been found.
*
- * The availability of a Vulkan loader and even an ICD does not by itself
- * guarantee that surface creation or even instance creation is possible.
- * For example, on Fermi systems Nvidia will install an ICD that provides no
- * actual Vulkan support. Call @ref glfwGetRequiredInstanceExtensions to check
- * whether the extensions necessary for Vulkan surface creation are available
- * and @ref glfwGetPhysicalDevicePresentationSupport to check whether a queue
- * family of a physical device supports image presentation.
+ * The availability of a Vulkan loader and even an ICD does not by itself guarantee that
+ * surface creation or even instance creation is possible. Call @ref
+ * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan
+ * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to
+ * check whether a queue family of a physical device supports image presentation.
*
* @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE`
* otherwise.
@@ -5317,7 +5691,7 @@ GLFWAPI int glfwVulkanSupported(void);
*
* This function returns an array of names of Vulkan instance extensions required
* by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the
- * list will always contains `VK_KHR_surface`, so if you don't require any
+ * list will always contain `VK_KHR_surface`, so if you don't require any
* additional extensions you can pass this list directly to the
* `VkInstanceCreateInfo` struct.
*
@@ -5342,9 +5716,6 @@ GLFWAPI int glfwVulkanSupported(void);
* returned array, as it is an error to specify an extension more than once in
* the `VkInstanceCreateInfo` struct.
*
- * @remark @macos This function currently only supports the
- * `VK_MVK_macos_surface` extension from MoltenVK.
- *
* @pointer_lifetime The returned array is allocated and freed by GLFW. You
* should not free it yourself. It is guaranteed to be valid only until the
* library is terminated.
@@ -5426,7 +5797,7 @@ GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* p
* GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR.
*
* @remark @macos This function currently always returns `GLFW_TRUE`, as the
- * `VK_MVK_macos_surface` extension does not provide
+ * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide
* a `vkGetPhysicalDevice*PresentationSupport` type function.
*
* @thread_safety This function may be called from any thread. For
@@ -5483,8 +5854,10 @@ GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhys
* @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should
* eliminate almost all occurrences of these errors.
*
- * @remark @macos This function currently only supports the
- * `VK_MVK_macos_surface` extension from MoltenVK.
+ * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the
+ * `VK_MVK_macos_surface` extension as a fallback. The name of the selected
+ * extension, if any, is included in the array returned by @ref
+ * glfwGetRequiredInstanceExtensions.
*
* @remark @macos This function creates and sets a `CAMetalLayer` instance for
* the window content view, which is required for MoltenVK to function.
@@ -5525,6 +5898,7 @@ GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window
*/
#ifndef GLAPIENTRY
#define GLAPIENTRY APIENTRY
+ #define GLFW_GLAPIENTRY_DEFINED
#endif
/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */
diff --git a/raylib/examples/others/external/include/GLFW/glfw3native.h b/raylib/examples/others/external/include/GLFW/glfw3native.h
index 4372cb7..7be0227 100644
--- a/raylib/examples/others/external/include/GLFW/glfw3native.h
+++ b/raylib/examples/others/external/include/GLFW/glfw3native.h
@@ -3,7 +3,7 @@
* A library for OpenGL, window and input
*------------------------------------------------------------------------
* Copyright (c) 2002-2006 Marcus Geelnard
- * Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>
+ * Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
@@ -62,7 +62,6 @@ extern "C" {
* * `GLFW_EXPOSE_NATIVE_COCOA`
* * `GLFW_EXPOSE_NATIVE_X11`
* * `GLFW_EXPOSE_NATIVE_WAYLAND`
- * * `GLFW_EXPOSE_NATIVE_MIR`
*
* The available context API macros are:
* * `GLFW_EXPOSE_NATIVE_WGL`
@@ -75,6 +74,16 @@ extern "C" {
* and which platform-specific headers to include. It is then up your (by
* definition platform-specific) code to handle which of these should be
* defined.
+ *
+ * If you do not want the platform-specific headers to be included, define
+ * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header.
+ *
+ * @code
+ * #define GLFW_EXPOSE_NATIVE_WIN32
+ * #define GLFW_EXPOSE_NATIVE_WGL
+ * #define GLFW_NATIVE_INCLUDE_NONE
+ * #include <GLFW/glfw3native.h>
+ * @endcode
*/
@@ -82,46 +91,65 @@ extern "C" {
* System headers and types
*************************************************************************/
-#if defined(GLFW_EXPOSE_NATIVE_WIN32)
- // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
- // example to allow applications to correctly declare a GL_ARB_debug_output
- // callback) but windows.h assumes no one will define APIENTRY before it does
- #if defined(GLFW_APIENTRY_DEFINED)
- #undef APIENTRY
- #undef GLFW_APIENTRY_DEFINED
+#if !defined(GLFW_NATIVE_INCLUDE_NONE)
+
+ #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL)
+ /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
+ * example to allow applications to correctly declare a GL_KHR_debug callback)
+ * but windows.h assumes no one will define APIENTRY before it does
+ */
+ #if defined(GLFW_APIENTRY_DEFINED)
+ #undef APIENTRY
+ #undef GLFW_APIENTRY_DEFINED
+ #endif
+ #include <windows.h>
+ #elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL)
+ #if defined(__OBJC__)
+ #import <Cocoa/Cocoa.h>
+ #else
+ #include <ApplicationServices/ApplicationServices.h>
+ #include <objc/objc.h>
+ #endif
+ #elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX)
+ #include <X11/Xlib.h>
+ #include <X11/extensions/Xrandr.h>
+ #elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
+ #include <wayland-client.h>
#endif
- #include <windows.h>
-#elif defined(GLFW_EXPOSE_NATIVE_COCOA)
- #include <ApplicationServices/ApplicationServices.h>
- #if defined(__OBJC__)
- #import <Cocoa/Cocoa.h>
- #else
- typedef void* id;
+
+ #if defined(GLFW_EXPOSE_NATIVE_WGL)
+ /* WGL is declared by windows.h */
+ #endif
+ #if defined(GLFW_EXPOSE_NATIVE_NSGL)
+ /* NSGL is declared by Cocoa.h */
+ #endif
+ #if defined(GLFW_EXPOSE_NATIVE_GLX)
+ /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
+ * default it also acts as an OpenGL header
+ * However, glx.h will include gl.h, which will define it unconditionally
+ */
+ #if defined(GLFW_GLAPIENTRY_DEFINED)
+ #undef GLAPIENTRY
+ #undef GLFW_GLAPIENTRY_DEFINED
+ #endif
+ #include <GL/glx.h>
+ #endif
+ #if defined(GLFW_EXPOSE_NATIVE_EGL)
+ #include <EGL/egl.h>
+ #endif
+ #if defined(GLFW_EXPOSE_NATIVE_OSMESA)
+ /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by
+ * default it also acts as an OpenGL header
+ * However, osmesa.h will include gl.h, which will define it unconditionally
+ */
+ #if defined(GLFW_GLAPIENTRY_DEFINED)
+ #undef GLAPIENTRY
+ #undef GLFW_GLAPIENTRY_DEFINED
+ #endif
+ #include <GL/osmesa.h>
#endif
-#elif defined(GLFW_EXPOSE_NATIVE_X11)
- #include <X11/Xlib.h>
- #include <X11/extensions/Xrandr.h>
-#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
- #include <wayland-client.h>
-#elif defined(GLFW_EXPOSE_NATIVE_MIR)
- #include <mir_toolkit/mir_client_library.h>
-#endif
-#if defined(GLFW_EXPOSE_NATIVE_WGL)
- /* WGL is declared by windows.h */
-#endif
-#if defined(GLFW_EXPOSE_NATIVE_NSGL)
- /* NSGL is declared by Cocoa.h */
-#endif
-#if defined(GLFW_EXPOSE_NATIVE_GLX)
- #include <GL/glx.h>
-#endif
-#if defined(GLFW_EXPOSE_NATIVE_EGL)
- #include <EGL/egl.h>
-#endif
-#if defined(GLFW_EXPOSE_NATIVE_OSMESA)
- #include <GL/osmesa.h>
-#endif
+#endif /*GLFW_NATIVE_INCLUDE_NONE*/
/*************************************************************************
@@ -135,6 +163,8 @@ extern "C" {
* of the specified monitor, or `NULL` if an [error](@ref error_handling)
* occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -150,6 +180,8 @@ GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);
* `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -164,6 +196,16 @@ GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);
* @return The `HWND` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
+ * @remark The `HDC` associated with the window can be queried with the
+ * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
+ * function.
+ * @code
+ * HDC dc = GetDC(glfwGetWin32Window(window));
+ * @endcode
+ * This DC is private and does not need to be released.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -180,6 +222,17 @@ GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
* @return The `HGLRC` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
+ * @remark The `HDC` associated with the window can be queried with the
+ * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc)
+ * function.
+ * @code
+ * HDC dc = GetDC(glfwGetWin32Window(window));
+ * @endcode
+ * This DC is private and does not need to be released.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -196,6 +249,8 @@ GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);
* @return The `CGDirectDisplayID` of the specified monitor, or
* `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -210,6 +265,8 @@ GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);
* @return The `NSWindow` of the specified window, or `nil` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -226,6 +283,9 @@ GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);
* @return The `NSOpenGLContext` of the specified window, or `nil` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -242,6 +302,8 @@ GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);
* @return The `Display` used by GLFW, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -256,6 +318,8 @@ GLFWAPI Display* glfwGetX11Display(void);
* @return The `RRCrtc` of the specified monitor, or `None` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -270,6 +334,8 @@ GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);
* @return The `RROutput` of the specified monitor, or `None` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -284,6 +350,8 @@ GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);
* @return The `Window` of the specified window, or `None` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -350,6 +418,9 @@ GLFWAPI const char* glfwGetX11SelectionString(void);
* @return The `GLXContext` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -364,6 +435,9 @@ GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);
* @return The `GLXWindow` of the specified window, or `None` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -380,6 +454,8 @@ GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);
* @return The `struct wl_display*` used by GLFW, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -394,6 +470,8 @@ GLFWAPI struct wl_display* glfwGetWaylandDisplay(void);
* @return The `struct wl_output*` of the specified monitor, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -408,35 +486,7 @@ GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor);
* @return The main `struct wl_surface*` of the specified window, or `NULL` if
* an [error](@ref error_handling) occurred.
*
- * @thread_safety This function may be called from any thread. Access is not
- * synchronized.
- *
- * @since Added in version 3.2.
- *
- * @ingroup native
- */
-GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
-#endif
-
-#if defined(GLFW_EXPOSE_NATIVE_MIR)
-/*! @brief Returns the `MirConnection*` used by GLFW.
- *
- * @return The `MirConnection*` used by GLFW, or `NULL` if an
- * [error](@ref error_handling) occurred.
- *
- * @thread_safety This function may be called from any thread. Access is not
- * synchronized.
- *
- * @since Added in version 3.2.
- *
- * @ingroup native
- */
-GLFWAPI MirConnection* glfwGetMirDisplay(void);
-
-/*! @brief Returns the Mir output ID of the specified monitor.
- *
- * @return The Mir output ID of the specified monitor, or zero if an
- * [error](@ref error_handling) occurred.
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
*
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
@@ -445,21 +495,7 @@ GLFWAPI MirConnection* glfwGetMirDisplay(void);
*
* @ingroup native
*/
-GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);
-
-/*! @brief Returns the `MirWindow*` of the specified window.
- *
- * @return The `MirWindow*` of the specified window, or `NULL` if an
- * [error](@ref error_handling) occurred.
- *
- * @thread_safety This function may be called from any thread. Access is not
- * synchronized.
- *
- * @since Added in version 3.2.
- *
- * @ingroup native
- */
-GLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* window);
+GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
#endif
#if defined(GLFW_EXPOSE_NATIVE_EGL)
@@ -468,6 +504,11 @@ GLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* window);
* @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NOT_INITIALIZED.
+ *
+ * @remark Because EGL is initialized on demand, this function will return
+ * `EGL_NO_DISPLAY` until the first context has been created via EGL.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -482,6 +523,9 @@ GLFWAPI EGLDisplay glfwGetEGLDisplay(void);
* @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -496,6 +540,9 @@ GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window);
* @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -519,6 +566,9 @@ GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window);
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -540,6 +590,9 @@ GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
@@ -554,6 +607,9 @@ GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height
* @return The `OSMesaContext` of the specified window, or `NULL` if an
* [error](@ref error_handling) occurred.
*
+ * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref
+ * GLFW_NOT_INITIALIZED.
+ *
* @thread_safety This function may be called from any thread. Access is not
* synchronized.
*
diff --git a/raylib/examples/others/raymath_vector_angle.c b/raylib/examples/others/raymath_vector_angle.c
index ad573f5..d0f8154 100644
--- a/raylib/examples/others/raymath_vector_angle.c
+++ b/raylib/examples/others/raymath_vector_angle.c
@@ -42,7 +42,7 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- float startangle;
+ float startangle = 0.0f;
if (angleMode == 0) startangle = -Vector2LineAngle(v0, v1)*RAD2DEG;
if (angleMode == 1) startangle = 0.0f;
diff --git a/raylib/examples/others/rlgl_standalone.c b/raylib/examples/others/rlgl_standalone.c
index 43cc328..ad5e5e9 100644
--- a/raylib/examples/others/rlgl_standalone.c
+++ b/raylib/examples/others/rlgl_standalone.c
@@ -5,8 +5,8 @@
* rlgl library is an abstraction layer for multiple OpenGL versions (1.1, 2.1, 3.3 Core, ES 2.0)
* that provides a pseudo-OpenGL 1.1 immediate-mode style API (rlVertex, rlTranslate, rlRotate...)
*
-* NOTE: This example requires OpenGL 3.3 or OpenGL ES 2.0 for shaders support,
-* OpenGL 1.1 does not support shaders but it can also be used.
+* WARNING: This example is intended only for PLATFORM_DESKTOP and OpenGL 3.3 Core profile.
+* It could work on other platforms if redesigned for those platforms (out-of-scope)
*
* DEPENDENCIES:
* glfw3 - Windows and context initialization library
@@ -64,9 +64,6 @@
#define RAYMATH_STATIC_INLINE
#include "raymath.h" // Vector2, Vector3, Quaternion and Matrix functionality
-#if defined(__EMSCRIPTEN__)
- #define GLFW_INCLUDE_ES2
-#endif
#include "GLFW/glfw3.h" // Windows/Context and inputs management
#include <stdio.h> // Required for: printf()
@@ -136,6 +133,8 @@ int main(void)
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_DEPTH_BITS, 16);
+
+ // WARNING: OpenGL 3.3 Core profile only
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs b/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
index 44d0834..82d0a75 100644
--- a/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
@@ -6,30 +6,30 @@ precision mediump float;
varying vec2 fragTexCoord;
varying vec4 fragColor;
-uniform vec2 screenDims; // Dimensions of the screen
uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
uniform vec2 offset; // Offset of the scale.
uniform float zoom; // Zoom of the scale.
// NOTE: Maximum number of shader for-loop iterations depend on GPU,
// for example, on RasperryPi for this examply only supports up to 60
-const int MAX_ITERATIONS = 48; // Max iterations to do
+const int maxIterations = 48; // Max iterations to do.
+const float colorCycles = 1.0f; // Number of times the color palette repeats.
// Square a complex number
vec2 ComplexSquare(vec2 z)
{
return vec2(
- z.x * z.x - z.y * z.y,
- z.x * z.y * 2.0
+ z.x*z.x - z.y*z.y,
+ z.x*z.y*2.0f
);
}
// Convert Hue Saturation Value (HSV) color into RGB
vec3 Hsv2rgb(vec3 c)
{
- vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
- vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
- return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+ vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f);
+ vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www);
+ return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y);
}
void main()
@@ -45,8 +45,8 @@ void main()
If the number is below 2, we keep iterating.
But when do we stop iterating if the number is always below 2 (it converges)?
- That is what MAX_ITERATIONS is for.
- Then we can divide the iterations by the MAX_ITERATIONS value to get a normalized value that we can
+ That is what maxIterations is for.
+ Then we can divide the iterations by the maxIterations value to get a normalized value that we can
then map to a color.
We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
@@ -55,13 +55,15 @@ void main()
// The pixel coordinates are scaled so they are on the mandelbrot scale
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
- vec2 z = vec2((fragTexCoord.x + offset.x/screenDims.x)*2.5/zoom, (fragTexCoord.y + offset.y/screenDims.y)*1.5/zoom);
+ vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5f, (fragTexCoord.y - 0.5f)*1.5f)/zoom;
+ z.x += offset.x;
+ z.y += offset.y;
int iter = 0;
for (int iterations = 0; iterations < 60; iterations++)
{
z = ComplexSquare(z) + c; // Iterate function
- if (dot(z, z) > 4.0) break;
+ if (dot(z, z) > 4.0f) break;
iter = iterations;
}
@@ -72,12 +74,12 @@ void main()
z = ComplexSquare(z) + c;
// This last part smooths the color (again see link above).
- float smoothVal = float(iter) + 1.0 - (log(log(length(z)))/log(2.0));
+ float smoothVal = float(iter) + 1.0f - (log(log(length(z)))/log(2.0f));
// Normalize the value so it is between 0 and 1.
- float norm = smoothVal/float(MAX_ITERATIONS);
+ float norm = smoothVal/float(maxIterations);
// If in set, color black. 0.999 allows for some float accuracy error.
- if (norm > 0.999) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
- else gl_FragColor = vec4(Hsv2rgb(vec3(norm, 1.0, 1.0)), 1.0);
+ if (norm > 0.999f) gl_FragColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ else gl_FragColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f);
}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
index 7367161..73531a8 100644
--- a/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
@@ -18,12 +18,6 @@ uniform vec4 colDiffuse;
#define LIGHT_DIRECTIONAL 0
#define LIGHT_POINT 1
-struct MaterialProperty {
- vec3 color;
- int useSampler;
- sampler2D sampler;
-};
-
struct Light {
int enabled;
int type;
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs b/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
index ec6c664..7ff401a 100644
--- a/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
@@ -42,5 +42,5 @@ void main()
tc += center;
vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
- gl_FragColor = vec4(color.rgb, 1.0);;
+ gl_FragColor = vec4(color.rgb, 1.0);
}
diff --git a/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs b/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs
new file mode 100644
index 0000000..392786a
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs
@@ -0,0 +1,21 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D diffuseMap;
+uniform vec4 tiling;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec2 texCoord = fragTexCoord*tiling;
+ fragColor = texture2D(diffuseMap, texCoord);
+
+ gl_FragColor = fragColor;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
index d9cfb44..8dda5a5 100644
--- a/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
@@ -16,12 +16,6 @@ uniform vec4 colDiffuse;
#define LIGHT_DIRECTIONAL 0
#define LIGHT_POINT 1
-struct MaterialProperty {
- vec3 color;
- int useSampler;
- sampler2D sampler;
-};
-
struct Light {
int enabled;
int type;
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs b/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs
new file mode 100644
index 0000000..c9c6a31
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs
@@ -0,0 +1,55 @@
+#version 330 core
+out vec4 finalColor;
+
+in vec2 texCoord;
+in vec2 texCoord2;
+
+uniform sampler2D gPosition;
+uniform sampler2D gNormal;
+uniform sampler2D gAlbedoSpec;
+
+struct Light {
+ int enabled;
+ int type; // Unused in this demo.
+ vec3 position;
+ vec3 target; // Unused in this demo.
+ vec4 color;
+};
+
+const int NR_LIGHTS = 4;
+uniform Light lights[NR_LIGHTS];
+uniform vec3 viewPosition;
+
+const float QUADRATIC = 0.032;
+const float LINEAR = 0.09;
+
+void main() {
+ vec3 fragPosition = texture(gPosition, texCoord).rgb;
+ vec3 normal = texture(gNormal, texCoord).rgb;
+ vec3 albedo = texture(gAlbedoSpec, texCoord).rgb;
+ float specular = texture(gAlbedoSpec, texCoord).a;
+
+ vec3 ambient = albedo * vec3(0.1f);
+ vec3 viewDirection = normalize(viewPosition - fragPosition);
+
+ for(int i = 0; i < NR_LIGHTS; ++i)
+ {
+ if(lights[i].enabled == 0) continue;
+ vec3 lightDirection = lights[i].position - fragPosition;
+ vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz;
+
+ vec3 halfwayDirection = normalize(lightDirection + viewDirection);
+ float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0);
+ vec3 specular = specular * spec * lights[i].color.xyz;
+
+ // Attenuation
+ float distance = length(lights[i].position - fragPosition);
+ float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance);
+ diffuse *= attenuation;
+ specular *= attenuation;
+ ambient += diffuse + specular;
+ }
+
+ finalColor = vec4(ambient, 1.0);
+}
+
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs b/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs
new file mode 100644
index 0000000..f2b1bd7
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs
@@ -0,0 +1,11 @@
+#version 330 core
+
+layout (location = 0) in vec3 vertexPosition;
+layout (location = 1) in vec2 vertexTexCoord;
+
+out vec2 texCoord;
+
+void main() {
+ gl_Position = vec4(vertexPosition, 1.0);
+ texCoord = vertexTexCoord;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs b/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs
new file mode 100644
index 0000000..c86e20a
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs
@@ -0,0 +1,22 @@
+#version 330 core
+layout (location = 0) out vec3 gPosition;
+layout (location = 1) out vec3 gNormal;
+layout (location = 2) out vec4 gAlbedoSpec;
+
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+in vec3 fragNormal;
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+
+void main() {
+ // store the fragment position vector in the first gbuffer texture
+ gPosition = fragPosition;
+ // also store the per-fragment normals into the gbuffer
+ gNormal = normalize(fragNormal);
+ // and the diffuse per-fragment color
+ gAlbedoSpec.rgb = texture(diffuseTexture, fragTexCoord).rgb;
+ // store specular intensity in gAlbedoSpec's alpha component
+ gAlbedoSpec.a = texture(specularTexture, fragTexCoord).r;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs b/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs
new file mode 100644
index 0000000..7d264ba
--- /dev/null
+++ b/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs
@@ -0,0 +1,24 @@
+#version 330 core
+layout (location = 0) in vec3 vertexPosition;
+layout (location = 1) in vec2 vertexTexCoord;
+layout (location = 2) in vec3 vertexNormal;
+
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec3 fragNormal;
+
+uniform mat4 matModel;
+uniform mat4 matView;
+uniform mat4 matProjection;
+
+void main()
+{
+ vec4 worldPos = matModel * vec4(vertexPosition, 1.0);
+ fragPosition = worldPos.xyz;
+ fragTexCoord = vertexTexCoord;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalMatrix * vertexNormal;
+
+ gl_Position = matProjection * matView * worldPos;
+}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs b/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
index c5ee0da..7a6f069 100644
--- a/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
@@ -7,28 +7,28 @@ in vec4 fragColor;
// Output fragment color
out vec4 finalColor;
-uniform vec2 screenDims; // Dimensions of the screen
uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
uniform vec2 offset; // Offset of the scale.
uniform float zoom; // Zoom of the scale.
-const int MAX_ITERATIONS = 255; // Max iterations to do.
+const int maxIterations = 255; // Max iterations to do.
+const float colorCycles = 2.0f; // Number of times the color palette repeats. Can show higher detail for higher iteration numbers.
// Square a complex number
vec2 ComplexSquare(vec2 z)
{
return vec2(
- z.x * z.x - z.y * z.y,
- z.x * z.y * 2.0
+ z.x*z.x - z.y*z.y,
+ z.x*z.y*2.0f
);
}
// Convert Hue Saturation Value (HSV) color into RGB
vec3 Hsv2rgb(vec3 c)
{
- vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
- vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
- return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+ vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f);
+ vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www);
+ return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y);
}
void main()
@@ -44,8 +44,8 @@ void main()
If the number is below 2, we keep iterating.
But when do we stop iterating if the number is always below 2 (it converges)?
- That is what MAX_ITERATIONS is for.
- Then we can divide the iterations by the MAX_ITERATIONS value to get a normalized value that we can
+ That is what maxIterations is for.
+ Then we can divide the iterations by the maxIterations value to get a normalized value that we can
then map to a color.
We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
@@ -54,14 +54,16 @@ void main()
// The pixel coordinates are scaled so they are on the mandelbrot scale
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
- vec2 z = vec2((fragTexCoord.x + offset.x/screenDims.x)*2.5/zoom, (fragTexCoord.y + offset.y/screenDims.y)*1.5/zoom);
+ vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5f, (fragTexCoord.y - 0.5f)*1.5f)/zoom;
+ z.x += offset.x;
+ z.y += offset.y;
int iterations = 0;
- for (iterations = 0; iterations < MAX_ITERATIONS; iterations++)
+ for (iterations = 0; iterations < maxIterations; iterations++)
{
z = ComplexSquare(z) + c; // Iterate function
- if (dot(z, z) > 4.0) break;
+ if (dot(z, z) > 4.0f) break;
}
// Another few iterations decreases errors in the smoothing calculation.
@@ -70,12 +72,12 @@ void main()
z = ComplexSquare(z) + c;
// This last part smooths the color (again see link above).
- float smoothVal = float(iterations) + 1.0 - (log(log(length(z)))/log(2.0));
+ float smoothVal = float(iterations) + 1.0f - (log(log(length(z)))/log(2.0f));
// Normalize the value so it is between 0 and 1.
- float norm = smoothVal/float(MAX_ITERATIONS);
+ float norm = smoothVal/float(maxIterations);
// If in set, color black. 0.999 allows for some float accuracy error.
- if (norm > 0.999) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
- else finalColor = vec4(Hsv2rgb(vec3(norm, 1.0, 1.0)), 1.0);
+ if (norm > 0.999f) finalColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f);
}
diff --git a/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs b/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
index 58845c8..d1f3140 100644
--- a/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
+++ b/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
@@ -19,12 +19,6 @@ out vec4 finalColor;
#define LIGHT_DIRECTIONAL 0
#define LIGHT_POINT 1
-struct MaterialProperty {
- vec3 color;
- int useSampler;
- sampler2D sampler;
-};
-
struct Light {
int enabled;
int type;
diff --git a/raylib/examples/shaders/shader_texture_tiling.c b/raylib/examples/shaders/shader_texture_tiling.c
deleted file mode 100644
index 868d6b8..0000000
--- a/raylib/examples/shaders/shader_texture_tiling.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************************
-*
-* raylib [textures] example - Texture Tiling
-*
-* Example demonstrates how to tile a texture on a 3D model using raylib.
-*
-* Example contributed by Luís Almeida (https://github.com/luis605)
-*
-* 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 Luís Almeida (https://github.com/luis605)
-*
-********************************************************************************************/
-
-#include "raylib.h"
-
-//------------------------------------------------------------------------------------
-// Program main entry point
-//------------------------------------------------------------------------------------
-
-int main(void)
-{
- const int screenWidth = 800;
- const int screenHeight = 600;
-
- // Initialization
- //--------------------------------------------------------------------------------------
- InitWindow(screenWidth, screenHeight, "Raylib Texture Tiling");
-
- SetTargetFPS(60);
-
- // Load a texture
- Texture2D texture = LoadTexture("resources/raylib_logo.png");
-
- // Create a cube mesh
- Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
-
- // Load the texture onto the GPU
- Model model = LoadModelFromMesh(cube);
- model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
-
- // Set the tiling of the texture
- float tiling[2] = {3.0f, 3.0f};
- Shader shader = LoadShader(0, "resources/shaders/glsl330/tiling.fs"); // Create a custom shader in a .glsl file
- SetShaderValue(shader, GetShaderLocation(shader, "tiling"), tiling, SHADER_UNIFORM_VEC2);
- model.materials[0].shader = shader;
-
- // Camera setup
- Camera camera = { 0 };
- camera.position = (Vector3){ 3.0f, 3.0f, 3.0f };
- camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
- camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
- camera.fovy = 45.0f;
- camera.projection = CAMERA_PERSPECTIVE;
-
- // Main game loop
- while (!WindowShouldClose())
- {
- // Update
- //----------------------------------------------------------------------------------
-
- BeginDrawing();
- ClearBackground(RAYWHITE);
- UpdateCamera(&camera, CAMERA_FREE);
-
- // Draw the model
- {
- BeginMode3D(camera);
- BeginShaderMode(shader);
-
- DrawModel(model, (Vector3){ 0.0f, 0.0f, 0.0f }, 5.0f, WHITE);
-
- EndShaderMode();
- EndMode3D();
- }
-
- DrawText("Use mouse to rotate the camera", 10, 10, 20, DARKGRAY);
-
- EndDrawing();
- }
-
- // De-Initialization
- //--------------------------------------------------------------------------------------
-
- UnloadTexture(texture); // Unload texture
- UnloadModel(model); // Unload model
- UnloadShader(shader); // Unload shader
-
-
- CloseWindow(); // Close window and OpenGL context
-
- return 0;
-}
diff --git a/raylib/examples/shaders/shaders_custom_uniform.c b/raylib/examples/shaders/shaders_custom_uniform.c
index 0a1a764..b3b8040 100644
--- a/raylib/examples/shaders/shaders_custom_uniform.c
+++ b/raylib/examples/shaders/shaders_custom_uniform.c
@@ -1,6 +1,6 @@
/*******************************************************************************************
*
-* raylib [shaders] example - Apply a postprocessing shader and connect a custom uniform variable
+* raylib [shaders] example - Postprocessing with custom uniform variable
*
* NOTE: This example requires raylib OpenGL 3.3 or ES2 versions for shaders support,
* OpenGL 1.1 does not support shaders, recompile raylib to OpenGL 3.3 version.
diff --git a/raylib/examples/shaders/shaders_deferred_render.c b/raylib/examples/shaders/shaders_deferred_render.c
new file mode 100644
index 0000000..21d2af3
--- /dev/null
+++ b/raylib/examples/shaders/shaders_deferred_render.c
@@ -0,0 +1,336 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - deferred rendering
+*
+* NOTE: This example requires raylib OpenGL 3.3 or OpenGL ES 3.0
+*
+* Example originally created with raylib 4.5, last time updated with raylib 4.5
+*
+* Example contributed by Justin Andreas Lacoste (@27justin) 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 Justin Andreas Lacoste (@27justin)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#include "rlgl.h"
+#include "raymath.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
+
+#include <stdlib.h> // Required for: NULL
+
+#define MAX_CUBES 30
+
+typedef struct GBuffer {
+ unsigned int framebuffer;
+
+ unsigned int positionTexture;
+ unsigned int normalTexture;
+ unsigned int albedoSpecTexture;
+
+ unsigned int depthRenderbuffer;
+} GBuffer;
+
+typedef enum {
+ DEFERRED_POSITION,
+ DEFERRED_NORMAL,
+ DEFERRED_ALBEDO,
+ DEFERRED_SHADING
+} DeferredMode;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ // -------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ InitWindow(screenWidth, screenHeight, "raylib [shaders] example - deferred render");
+
+ Camera camera = { 0 };
+ camera.position = (Vector3){ 5.0f, 4.0f, 5.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 60.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Load plane model from a generated mesh
+ Model model = LoadModelFromMesh(GenMeshPlane(10.0f, 10.0f, 3, 3));
+ Model cube = LoadModelFromMesh(GenMeshCube(2.0f, 2.0f, 2.0f));
+
+ // Load geometry buffer (G-buffer) shader and deferred shader
+ Shader gbufferShader = LoadShader("resources/shaders/glsl330/gbuffer.vs",
+ "resources/shaders/glsl330/gbuffer.fs");
+
+ Shader deferredShader = LoadShader("resources/shaders/glsl330/deferred_shading.vs",
+ "resources/shaders/glsl330/deferred_shading.fs");
+ deferredShader.locs[SHADER_LOC_VECTOR_VIEW] = GetShaderLocation(deferredShader, "viewPosition");
+
+ // Initialize the G-buffer
+ GBuffer gBuffer = { 0 };
+ gBuffer.framebuffer = rlLoadFramebuffer(screenWidth, screenHeight);
+
+ if (!gBuffer.framebuffer)
+ {
+ TraceLog(LOG_WARNING, "Failed to create framebuffer");
+ exit(1);
+ }
+
+ rlEnableFramebuffer(gBuffer.framebuffer);
+
+ // Since we are storing position and normal data in these textures,
+ // we need to use a floating point format.
+ gBuffer.positionTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, 1);
+
+ gBuffer.normalTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32, 1);
+ // Albedo (diffuse color) and specular strength can be combined into one texture.
+ // The color in RGB, and the specular strength in the alpha channel.
+ gBuffer.albedoSpecTexture = rlLoadTexture(NULL, screenWidth, screenHeight, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
+
+ // Activate the draw buffers for our framebuffer
+ rlActiveDrawBuffers(3);
+
+ // Now we attach our textures to the framebuffer.
+ rlFramebufferAttach(gBuffer.framebuffer, gBuffer.positionTexture, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0);
+ rlFramebufferAttach(gBuffer.framebuffer, gBuffer.normalTexture, RL_ATTACHMENT_COLOR_CHANNEL1, RL_ATTACHMENT_TEXTURE2D, 0);
+ rlFramebufferAttach(gBuffer.framebuffer, gBuffer.albedoSpecTexture, RL_ATTACHMENT_COLOR_CHANNEL2, RL_ATTACHMENT_TEXTURE2D, 0);
+
+ // Finally we attach the depth buffer.
+ gBuffer.depthRenderbuffer = rlLoadTextureDepth(screenWidth, screenHeight, true);
+ rlFramebufferAttach(gBuffer.framebuffer, gBuffer.depthRenderbuffer, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_RENDERBUFFER, 0);
+
+ // Make sure our framebuffer is complete.
+ // NOTE: rlFramebufferComplete() automatically unbinds the framebuffer, so we don't have
+ // to rlDisableFramebuffer() here.
+ if (!rlFramebufferComplete(gBuffer.framebuffer))
+ {
+ TraceLog(LOG_WARNING, "Framebuffer is not complete");
+ exit(1);
+ }
+
+ // Now we initialize the sampler2D uniform's in the deferred shader.
+ // We do this by setting the uniform's value to the color channel slot we earlier
+ // bound our textures to.
+ rlEnableShader(deferredShader.id);
+
+ rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gPosition"), 0);
+ rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gNormal"), 1);
+ rlSetUniformSampler(rlGetLocationUniform(deferredShader.id, "gAlbedoSpec"), 2);
+
+ rlDisableShader();
+
+ // Assign out lighting shader to model
+ model.materials[0].shader = gbufferShader;
+ cube.materials[0].shader = gbufferShader;
+
+ // Create lights
+ //--------------------------------------------------------------------------------------
+ Light lights[MAX_LIGHTS] = { 0 };
+ lights[0] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, -2 }, Vector3Zero(), YELLOW, deferredShader);
+ lights[1] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, 2 }, Vector3Zero(), RED, deferredShader);
+ lights[2] = CreateLight(LIGHT_POINT, (Vector3){ -2, 1, 2 }, Vector3Zero(), GREEN, deferredShader);
+ lights[3] = CreateLight(LIGHT_POINT, (Vector3){ 2, 1, -2 }, Vector3Zero(), BLUE, deferredShader);
+
+ const float CUBE_SCALE = 0.25;
+ Vector3 cubePositions[MAX_CUBES] = { 0 };
+ float cubeRotations[MAX_CUBES] = { 0 };
+
+ for (int i = 0; i < MAX_CUBES; i++)
+ {
+ cubePositions[i] = (Vector3){
+ .x = (float)(rand()%10) - 5,
+ .y = (float)(rand()%5),
+ .z = (float)(rand()%10) - 5,
+ };
+
+ cubeRotations[i] = (float)(rand()%360);
+ }
+
+ DeferredMode mode = DEFERRED_SHADING;
+
+ rlEnableDepthTest();
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //---------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose())
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_ORBITAL);
+
+ // Update the shader with the camera view vector (points towards { 0.0f, 0.0f, 0.0f })
+ float cameraPos[3] = { camera.position.x, camera.position.y, camera.position.z };
+ SetShaderValue(deferredShader, deferredShader.locs[SHADER_LOC_VECTOR_VIEW], cameraPos, SHADER_UNIFORM_VEC3);
+
+ // Check key inputs to enable/disable lights
+ if (IsKeyPressed(KEY_Y)) { lights[0].enabled = !lights[0].enabled; }
+ if (IsKeyPressed(KEY_R)) { lights[1].enabled = !lights[1].enabled; }
+ if (IsKeyPressed(KEY_G)) { lights[2].enabled = !lights[2].enabled; }
+ if (IsKeyPressed(KEY_B)) { lights[3].enabled = !lights[3].enabled; }
+
+ // Check key inputs to switch between G-buffer textures
+ if (IsKeyPressed(KEY_ONE)) mode = DEFERRED_POSITION;
+ if (IsKeyPressed(KEY_TWO)) mode = DEFERRED_NORMAL;
+ if (IsKeyPressed(KEY_THREE)) mode = DEFERRED_ALBEDO;
+ if (IsKeyPressed(KEY_FOUR)) mode = DEFERRED_SHADING;
+
+ // Update light values (actually, only enable/disable them)
+ for (int i = 0; i < MAX_LIGHTS; i++) UpdateLightValues(deferredShader, lights[i]);
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ // ---------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ // Draw to the geometry buffer by first activating it
+ rlEnableFramebuffer(gBuffer.framebuffer);
+ rlClearScreenBuffers(); // Clear color and depth buffer
+
+ rlDisableColorBlend();
+ BeginMode3D(camera);
+ // NOTE: We have to use rlEnableShader here. `BeginShaderMode` or thus `rlSetShader`
+ // will not work, as they won't immediately load the shader program.
+ rlEnableShader(gbufferShader.id);
+ // When drawing a model here, make sure that the material's shaders
+ // are set to the gbuffer shader!
+ DrawModel(model, Vector3Zero(), 1.0f, WHITE);
+ DrawModel(cube, (Vector3) { 0.0, 1.0f, 0.0 }, 1.0f, WHITE);
+
+ for (int i = 0; i < MAX_CUBES; i++)
+ {
+ Vector3 position = cubePositions[i];
+ DrawModelEx(cube, position, (Vector3) { 1, 1, 1 }, cubeRotations[i], (Vector3) { CUBE_SCALE, CUBE_SCALE, CUBE_SCALE }, WHITE);
+ }
+
+ rlDisableShader();
+ EndMode3D();
+ rlEnableColorBlend();
+
+ // Go back to the default framebuffer (0) and draw our deferred shading.
+ rlDisableFramebuffer();
+ rlClearScreenBuffers(); // Clear color & depth buffer
+
+ switch (mode)
+ {
+ case DEFERRED_SHADING:
+ {
+ BeginMode3D(camera);
+ rlDisableColorBlend();
+ rlEnableShader(deferredShader.id);
+ // Activate our g-buffer textures
+ // These will now be bound to the sampler2D uniforms `gPosition`, `gNormal`,
+ // and `gAlbedoSpec`
+ rlActiveTextureSlot(0);
+ rlEnableTexture(gBuffer.positionTexture);
+ rlActiveTextureSlot(1);
+ rlEnableTexture(gBuffer.normalTexture);
+ rlActiveTextureSlot(2);
+ rlEnableTexture(gBuffer.albedoSpecTexture);
+
+ // Finally, we draw a fullscreen quad to our default framebuffer
+ // This will now be shaded using our deferred shader
+ rlLoadDrawQuad();
+ rlDisableShader();
+ rlEnableColorBlend();
+ EndMode3D();
+
+ // As a last step, we now copy over the depth buffer from our g-buffer to the default framebuffer.
+ rlEnableFramebuffer(gBuffer.framebuffer); //glBindFramebuffer(GL_READ_FRAMEBUFFER, gBuffer.framebuffer);
+ rlEnableFramebuffer(0); //glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+ rlBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, 0x00000100); // GL_DEPTH_BUFFER_BIT
+ rlDisableFramebuffer();
+
+ // Since our shader is now done and disabled, we can draw our lights in default
+ // forward rendering
+ BeginMode3D(camera);
+ rlEnableShader(rlGetShaderIdDefault());
+ for(int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled) DrawSphereEx(lights[i].position, 0.2f, 8, 8, lights[i].color);
+ else DrawSphereWires(lights[i].position, 0.2f, 8, 8, ColorAlpha(lights[i].color, 0.3f));
+ }
+ rlDisableShader();
+ EndMode3D();
+ DrawText("FINAL RESULT", 10, screenHeight - 30, 20, DARKGREEN);
+ } break;
+
+ case DEFERRED_POSITION:
+ {
+ DrawTextureRec((Texture2D){
+ .id = gBuffer.positionTexture,
+ .width = screenWidth,
+ .height = screenHeight,
+ }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE);
+ DrawText("POSITION TEXTURE", 10, screenHeight - 30, 20, DARKGREEN);
+ } break;
+
+ case DEFERRED_NORMAL:
+ {
+ DrawTextureRec((Texture2D){
+ .id = gBuffer.normalTexture,
+ .width = screenWidth,
+ .height = screenHeight,
+ }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE);
+ DrawText("NORMAL TEXTURE", 10, screenHeight - 30, 20, DARKGREEN);
+ } break;
+
+ case DEFERRED_ALBEDO:
+ {
+ DrawTextureRec((Texture2D){
+ .id = gBuffer.albedoSpecTexture,
+ .width = screenWidth,
+ .height = screenHeight,
+ }, (Rectangle) { 0, 0, screenWidth, -screenHeight }, Vector2Zero(), RAYWHITE);
+ DrawText("ALBEDO TEXTURE", 10, screenHeight - 30, 20, DARKGREEN);
+ } break;
+ }
+
+ DrawText("Toggle lights keys: [Y][R][G][B]", 10, 40, 20, DARKGRAY);
+ DrawText("Switch G-buffer textures: [1][2][3][4]", 10, 70, 20, DARKGRAY);
+
+ DrawFPS(10, 10);
+
+ EndDrawing();
+ // -----------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(model); // Unload the models
+ UnloadModel(cube);
+
+ UnloadShader(deferredShader); // Unload shaders
+ UnloadShader(gbufferShader);
+
+ // Unload geometry buffer and all attached textures
+ rlUnloadFramebuffer(gBuffer.framebuffer);
+ rlUnloadTexture(gBuffer.positionTexture);
+ rlUnloadTexture(gBuffer.normalTexture);
+ rlUnloadTexture(gBuffer.albedoSpecTexture);
+ rlUnloadTexture(gBuffer.depthRenderbuffer);
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
+
diff --git a/raylib/examples/shaders/shaders_deferred_render.png b/raylib/examples/shaders/shaders_deferred_render.png
new file mode 100644
index 0000000..90fa012
--- /dev/null
+++ b/raylib/examples/shaders/shaders_deferred_render.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_hybrid_render.c b/raylib/examples/shaders/shaders_hybrid_render.c
index 53e14b8..6242b30 100644
--- a/raylib/examples/shaders/shaders_hybrid_render.c
+++ b/raylib/examples/shaders/shaders_hybrid_render.c
@@ -1,4 +1,4 @@
-/*******************************************************************************************
+/*******************************************************************************************
*
* raylib [shaders] example - Hybrid Rendering
*
@@ -68,7 +68,7 @@ int main(void)
marchLocs.screenCenter = GetShaderLocation(shdrRaymarch, "screenCenter");
// Transfer screenCenter position to shader. Which is used to calculate ray direction.
- Vector2 screenCenter = {.x = screenWidth/2.0, .y = screenHeight/2.0};
+ Vector2 screenCenter = {.x = screenWidth/2.0f, .y = screenHeight/2.0f};
SetShaderValue(shdrRaymarch, marchLocs.screenCenter , &screenCenter , SHADER_UNIFORM_VEC2);
// Use Customized function to create writable depth texture buffer
@@ -84,7 +84,7 @@ int main(void)
};
// Camera FOV is pre-calculated in the camera Distance.
- double camDist = 1.0/(tan(camera.fovy*0.5*DEG2RAD));
+ float camDist = 1.0f/(tanf(camera.fovy*0.5f*DEG2RAD));
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -113,7 +113,7 @@ int main(void)
// Raymarch Scene
rlEnableDepthTest(); //Manually enable Depth Test to handle multiple rendering methods.
BeginShaderMode(shdrRaymarch);
- DrawRectangleRec((Rectangle){0,0,screenWidth,screenHeight},WHITE);
+ DrawRectangleRec((Rectangle){0,0, (float)screenWidth, (float)screenHeight},WHITE);
EndShaderMode();
// Raserize Scene
@@ -132,7 +132,7 @@ int main(void)
BeginDrawing();
ClearBackground(RAYWHITE);
- DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
+ DrawTextureRec(target.texture, (Rectangle) { 0, 0, (float)screenWidth, (float)-screenHeight }, (Vector2) { 0, 0 }, WHITE);
DrawFPS(10, 10);
EndDrawing();
//----------------------------------------------------------------------------------
diff --git a/raylib/examples/shaders/shaders_julia_set.c b/raylib/examples/shaders/shaders_julia_set.c
index aebb287..608d3b5 100644
--- a/raylib/examples/shaders/shaders_julia_set.c
+++ b/raylib/examples/shaders/shaders_julia_set.c
@@ -9,12 +9,12 @@
*
* Example originally created with raylib 2.5, last time updated with raylib 4.0
*
-* Example contributed by eggmund (@eggmund) and reviewed by Ramon Santamaria (@raysan5)
+* Example contributed by Josh Colclough (@joshcol9232) 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) 2019-2023 eggmund (@eggmund) and Ramon Santamaria (@raysan5)
+* Copyright (c) 2019-2023 Josh Colclough (@joshcol9232) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/
@@ -37,6 +37,13 @@ const float pointsOfInterest[6][2] =
{ -0.70176f, -0.3842f },
};
+const int screenWidth = 800;
+const int screenHeight = 450;
+const float zoomSpeed = 1.01f;
+const float offsetSpeedMul = 2.0f;
+
+const float startingZoom = 0.75f;
+
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
@@ -44,10 +51,6 @@ int main(void)
{
// Initialization
//--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
-
- //SetConfigFlags(FLAG_WINDOW_HIGHDPI);
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets");
// Load julia set shader
@@ -61,10 +64,8 @@ int main(void)
float c[2] = { pointsOfInterest[0][0], pointsOfInterest[0][1] };
// Offset and zoom to draw the julia set at. (centered on screen and default size)
- float offset[2] = { -(float)GetScreenWidth()/2, -(float)GetScreenHeight()/2 };
- float zoom = 1.0f;
-
- Vector2 offsetSpeed = { 0.0f, 0.0f };
+ float offset[2] = { 0.0f, 0.0f };
+ float zoom = startingZoom;
// Get variable (uniform) locations on the shader to connect with the program
// NOTE: If uniform variable could not be found in the shader, function returns -1
@@ -72,17 +73,13 @@ int main(void)
int zoomLoc = GetShaderLocation(shader, "zoom");
int offsetLoc = GetShaderLocation(shader, "offset");
- // Tell the shader what the screen dimensions, zoom, offset and c are
- float screenDims[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
- SetShaderValue(shader, GetShaderLocation(shader, "screenDims"), screenDims, SHADER_UNIFORM_VEC2);
-
+ // Upload the shader uniform values!
SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
int incrementSpeed = 0; // Multiplier of speed to change c value
bool showControls = true; // Show controls
- bool pause = false; // Pause animation
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -110,42 +107,50 @@ int main(void)
SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
}
- if (IsKeyPressed(KEY_SPACE)) pause = !pause; // Pause animation (c change)
- if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
-
- if (!pause)
+ // If "R" is pressed, reset zoom and offset.
+ if (IsKeyPressed(KEY_R))
{
- if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
- else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
-
- // TODO: The idea is to zoom and move around with mouse
- // Probably offset movement should be proportional to zoom level
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
- {
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) zoom += zoom*0.003f;
- if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) zoom -= zoom*0.003f;
-
- Vector2 mousePos = GetMousePosition();
+ zoom = startingZoom;
+ offset[0] = 0.0f;
+ offset[1] = 0.0f;
+ SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
+ }
- offsetSpeed.x = mousePos.x -(float)screenWidth/2;
- offsetSpeed.y = mousePos.y -(float)screenHeight/2;
+ if (IsKeyPressed(KEY_SPACE)) incrementSpeed = 0; // Pause animation (c change)
+ if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
- // Slowly move camera to targetOffset
- offset[0] += GetFrameTime()*offsetSpeed.x*0.8f;
- offset[1] += GetFrameTime()*offsetSpeed.y*0.8f;
- }
- else offsetSpeed = (Vector2){ 0.0f, 0.0f };
+ if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
+ else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
+ // If either left or right button is pressed, zoom in/out.
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
+ {
+ // Change zoom. If Mouse left -> zoom in. Mouse right -> zoom out.
+ zoom *= IsMouseButtonDown(MOUSE_BUTTON_LEFT)? zoomSpeed : 1.0f/zoomSpeed;
+
+ const Vector2 mousePos = GetMousePosition();
+ Vector2 offsetVelocity;
+ // Find the velocity at which to change the camera. Take the distance of the mouse
+ // from the center of the screen as the direction, and adjust magnitude based on
+ // the current zoom.
+ offsetVelocity.x = (mousePos.x/(float)screenWidth - 0.5f)*offsetSpeedMul/zoom;
+ offsetVelocity.y = (mousePos.y/(float)screenHeight - 0.5f)*offsetSpeedMul/zoom;
+
+ // Apply move velocity to camera
+ offset[0] += GetFrameTime()*offsetVelocity.x;
+ offset[1] += GetFrameTime()*offsetVelocity.y;
+
+ // Update the shader uniform values!
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
-
- // Increment c value with time
- float amount = GetFrameTime()*incrementSpeed*0.0005f;
- c[0] += amount;
- c[1] += amount;
-
- SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
}
+
+ // Increment c value with time
+ const float dc = GetFrameTime()*(float)incrementSpeed*0.0005f;
+ c[0] += dc;
+ c[1] += dc;
+ SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
//----------------------------------------------------------------------------------
// Draw
@@ -178,7 +183,8 @@ int main(void)
DrawText("Press KEY_F1 to toggle these controls", 10, 30, 10, RAYWHITE);
DrawText("Press KEYS [1 - 6] to change point of interest", 10, 45, 10, RAYWHITE);
DrawText("Press KEY_LEFT | KEY_RIGHT to change speed", 10, 60, 10, RAYWHITE);
- DrawText("Press KEY_SPACE to pause movement animation", 10, 75, 10, RAYWHITE);
+ DrawText("Press KEY_SPACE to stop movement animation", 10, 75, 10, RAYWHITE);
+ DrawText("Press KEY_R to recenter the camera", 10, 90, 10, RAYWHITE);
}
EndDrawing();
//----------------------------------------------------------------------------------
diff --git a/raylib/examples/shaders/shaders_raymarching.c b/raylib/examples/shaders/shaders_raymarching.c
index e9b7755..ff403e6 100644
--- a/raylib/examples/shaders/shaders_raymarching.c
+++ b/raylib/examples/shaders/shaders_raymarching.c
@@ -82,7 +82,8 @@ int main(void)
// Check if screen is resized
if (IsWindowResized())
{
- float resolution[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
+ resolution[0] = (float)GetScreenWidth();
+ resolution[1] = (float)GetScreenHeight();
SetShaderValue(shader, resolutionLoc, resolution, SHADER_UNIFORM_VEC2);
}
//----------------------------------------------------------------------------------
diff --git a/raylib/examples/shaders/shaders_texture_tiling.c b/raylib/examples/shaders/shaders_texture_tiling.c
new file mode 100644
index 0000000..0d07bdf
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_tiling.c
@@ -0,0 +1,105 @@
+/*******************************************************************************************
+*
+* raylib [shaders] example - texture tiling
+*
+* Example demonstrates how to tile a texture on a 3D model using raylib.
+*
+* Example contributed by Luis Almeida (@luis605) 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 Luis Almeida (@luis605)
+*
+********************************************************************************************/
+
+#include "raylib.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 - texture tiling");
+
+ // Define the camera to look into our 3d world
+ Camera3D camera = { 0 };
+ camera.position = (Vector3){ 4.0f, 4.0f, 4.0f }; // Camera position
+ camera.target = (Vector3){ 0.0f, 0.5f, 0.0f }; // Camera looking at point
+ camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
+ camera.fovy = 45.0f; // Camera field-of-view Y
+ camera.projection = CAMERA_PERSPECTIVE; // Camera projection type
+
+ // Load a cube model
+ Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
+ Model model = LoadModelFromMesh(cube);
+
+ // Load a texture and assign to cube model
+ Texture2D texture = LoadTexture("resources/cubicmap_atlas.png");
+ model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = texture;
+
+ // Set the texture tiling using a shader
+ float tiling[2] = { 3.0f, 3.0f };
+ Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/tiling.fs", GLSL_VERSION));
+ SetShaderValue(shader, GetShaderLocation(shader, "tiling"), tiling, SHADER_UNIFORM_VEC2);
+ model.materials[0].shader = shader;
+
+ DisableCursor(); // Limit cursor to relative movement inside the window
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ UpdateCamera(&camera, CAMERA_FREE);
+
+ if (IsKeyPressed('Z')) camera.target = (Vector3){ 0.0f, 0.5f, 0.0f };
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ BeginMode3D(camera);
+
+ BeginShaderMode(shader);
+ DrawModel(model, (Vector3){ 0.0f, 0.0f, 0.0f }, 2.0f, WHITE);
+ EndShaderMode();
+
+ DrawGrid(10, 1.0f);
+
+ EndMode3D();
+
+ DrawText("Use mouse to rotate the camera", 10, 10, 20, DARKGRAY);
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ UnloadModel(model); // Unload model
+ UnloadShader(shader); // Unload shader
+ UnloadTexture(texture); // Unload texture
+
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+}
diff --git a/raylib/examples/shaders/shaders_texture_tiling.png b/raylib/examples/shaders/shaders_texture_tiling.png
new file mode 100644
index 0000000..5dfe76e
--- /dev/null
+++ b/raylib/examples/shaders/shaders_texture_tiling.png
Binary files differ
diff --git a/raylib/examples/shaders/shaders_write_depth.c b/raylib/examples/shaders/shaders_write_depth.c
index d9e40d0..3169724 100644
--- a/raylib/examples/shaders/shaders_write_depth.c
+++ b/raylib/examples/shaders/shaders_write_depth.c
@@ -1,4 +1,4 @@
-/*******************************************************************************************
+/*******************************************************************************************
*
* raylib [shaders] example - Depth buffer writing
*
@@ -92,7 +92,7 @@ int main(void)
BeginDrawing();
ClearBackground(RAYWHITE);
- DrawTextureRec(target.texture, (Rectangle) { 0, 0, screenWidth, -screenHeight }, (Vector2) { 0, 0 }, WHITE);
+ DrawTextureRec(target.texture, (Rectangle) { 0, 0, (float)screenWidth, (float)-screenHeight }, (Vector2) { 0, 0 }, WHITE);
DrawFPS(10, 10);
EndDrawing();
//----------------------------------------------------------------------------------
diff --git a/raylib/examples/shapes/raygui.h b/raylib/examples/shapes/raygui.h
index 26d6bac..9127710 100644
--- a/raylib/examples/shapes/raygui.h
+++ b/raylib/examples/shapes/raygui.h
@@ -136,7 +136,7 @@
*
* #define RAYGUI_DEBUG_RECS_BOUNDS
* Draw control bounds rectangles for debug
-*
+*
* #define RAYGUI_DEBUG_TEXT_BOUNDS
* Draw text bounds rectangles for debug
*
@@ -246,7 +246,7 @@
* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria.
*
* DEPENDENCIES:
-* raylib 4.6-dev Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing
+* raylib 5.0 - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing
*
* STANDALONE MODE:
* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled
@@ -498,7 +498,7 @@ typedef enum {
typedef enum {
// Default -> populates to all controls when set
DEFAULT = 0,
-
+
// Basic controls
LABEL, // Used also for: LABELBUTTON
BUTTON,
@@ -1775,7 +1775,7 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
{
#define RAYGUI_MIN_SCROLLBAR_WIDTH 40
#define RAYGUI_MIN_SCROLLBAR_HEIGHT 40
-
+
int result = 0;
GuiState state = guiState;
float mouseWheelSpeed = 20.0f; // Default movement speed with mouse wheel
@@ -1806,27 +1806,27 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0;
int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0;
- Rectangle horizontalScrollBar = {
- (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH),
- (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH),
- (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH),
- (float)horizontalScrollBarWidth
+ Rectangle horizontalScrollBar = {
+ (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)horizontalScrollBarWidth
};
- Rectangle verticalScrollBar = {
- (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)),
- (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH),
- (float)verticalScrollBarWidth,
- (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)
+ Rectangle verticalScrollBar = {
+ (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)),
+ (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH),
+ (float)verticalScrollBarWidth,
+ (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH)
};
// Make sure scroll bars have a minimum width/height
// NOTE: If content >>> bounds, size could be very small or even 0
- if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH)
+ if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH)
{
horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH;
mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.height vs bounds.height
}
- if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT)
+ if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT)
{
verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT;
mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.width vs bounds.width
@@ -2155,7 +2155,7 @@ int GuiToggleSlider(Rectangle bounds, const char *text, int *active)
}
else state = STATE_FOCUSED;
}
-
+
if ((*active) && (state != STATE_FOCUSED)) state = STATE_PRESSED;
}
@@ -2625,8 +2625,6 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
if (CheckCollisionPointRec(mousePosition, textBounds)) // Mouse hover text
{
float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize;
- int codepoint = 0;
- int codepointSize = 0;
int codepointIndex = 0;
float glyphWidth = 0.0f;
float widthToMouseX = 0;
@@ -2646,7 +2644,7 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
mouseCursorIndex = i;
break;
}
-
+
widthToMouseX += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
}
@@ -2655,7 +2653,7 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
if (GetMousePosition().x >= (textBounds.x + textEndWidth - glyphWidth/2))
{
mouseCursor.x = textBounds.x + textEndWidth;
- mouseCursorIndex = strlen(text);
+ mouseCursorIndex = (int)strlen(text);
}
// Place cursor at required index on mouse click
@@ -2743,7 +2741,7 @@ bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode
GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE);
GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE);
GuiSetStyle(TEXTBOX, TEXT_READONLY, 0);
-
+
return pressed;
}
*/
@@ -2937,6 +2935,7 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth)
{
int result = 0;
+ float oldValue = *value;
GuiState state = guiState;
float temp = (maxValue - minValue)/2.0f;
@@ -3006,6 +3005,10 @@ int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight,
else if (*value < minValue) *value = minValue;
}
+ // Control value change check
+ if(oldValue == *value) result = 0;
+ else result = 1;
+
// Bar limits check
if (sliderWidth > 0) // Slider
{
@@ -3085,7 +3088,7 @@ int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight
if (*value > maxValue) *value = maxValue;
// WARNING: Working with floats could lead to rounding issues
- if ((state != STATE_DISABLED)) progress.width = (float)(*value/(maxValue - minValue))*bounds.width - ((*value >= maxValue) ? (float)(2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)) : 0.0f);
+ if ((state != STATE_DISABLED)) progress.width = (float)(*value/(maxValue - minValue))*bounds.width - ((*value >= maxValue)? (float)(2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)) : 0.0f);
//--------------------------------------------------------------------
// Draw control
@@ -3366,8 +3369,7 @@ int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
pickerSelector.x = bounds.x + (float)hsv.y*bounds.width; // HSV: Saturation
pickerSelector.y = bounds.y + (1.0f - (float)hsv.z)*bounds.height; // HSV: Value
- float hue = -1.0f;
- Vector3 maxHue = { hue >= 0.0f ? hue : hsv.x, 1.0f, 1.0f };
+ Vector3 maxHue = { hsv.x, 1.0f, 1.0f };
Vector3 rgbHue = ConvertHSVtoRGB(maxHue);
Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x),
(unsigned char)(255.0f*rgbHue.y),
@@ -3680,8 +3682,7 @@ int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
pickerSelector.x = bounds.x + (float)colorHsv->y*bounds.width; // HSV: Saturation
pickerSelector.y = bounds.y + (1.0f - (float)colorHsv->z)*bounds.height; // HSV: Value
- float hue = -1.0f;
- Vector3 maxHue = { hue >= 0.0f ? hue : colorHsv->x, 1.0f, 1.0f };
+ Vector3 maxHue = { colorHsv->x, 1.0f, 1.0f };
Vector3 rgbHue = ConvertHSVtoRGB(maxHue);
Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x),
(unsigned char)(255.0f*rgbHue.y),
@@ -3894,12 +3895,14 @@ int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vect
GuiState state = guiState;
Vector2 mousePoint = GetMousePosition();
- Vector2 currentMouseCell = { 0 };
+ Vector2 currentMouseCell = { -1, -1 };
float spaceWidth = spacing/(float)subdivs;
int linesV = (int)(bounds.width/spaceWidth) + 1;
int linesH = (int)(bounds.height/spaceWidth) + 1;
+ int color = GuiGetStyle(DEFAULT, LINE_COLOR);
+
// Update control
//--------------------------------------------------------------------
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
@@ -3915,28 +3918,23 @@ int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vect
// Draw control
//--------------------------------------------------------------------
- switch (state)
+ if (state == STATE_DISABLED) color = GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED);
+
+ if (subdivs > 0)
{
- case STATE_NORMAL:
+ // Draw vertical grid lines
+ for (int i = 0; i < linesV; i++)
{
- if (subdivs > 0)
- {
- // Draw vertical grid lines
- for (int i = 0; i < linesV; i++)
- {
- Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height };
- GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA));
- }
+ Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height };
+ GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA));
+ }
- // Draw horizontal grid lines
- for (int i = 0; i < linesH; i++)
- {
- Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width, 1 };
- GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(GuiGetStyle(DEFAULT, LINE_COLOR)), RAYGUI_GRID_ALPHA));
- }
- }
- } break;
- default: break;
+ // Draw horizontal grid lines
+ for (int i = 0; i < linesH; i++)
+ {
+ Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width, 1 };
+ GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA));
+ }
}
if (mouseCell != NULL) *mouseCell = currentMouseCell;
@@ -4101,7 +4099,7 @@ void GuiLoadStyleDefault(void)
GuiSetStyle(DEFAULT, BORDER_WIDTH, 1);
GuiSetStyle(DEFAULT, TEXT_PADDING, 0);
GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
-
+
// Initialize default extended property values
// NOTE: By default, extended property values are initialized to 0
GuiSetStyle(DEFAULT, TEXT_SIZE, 10); // DEFAULT, shared by all controls
@@ -4189,7 +4187,7 @@ const char *GuiIconText(int iconId, const char *text)
return NULL;
#else
static char buffer[1024] = { 0 };
- static char iconBuffer[6] = { 0 };
+ static char iconBuffer[16] = { 0 };
if (text != NULL)
{
@@ -4206,7 +4204,7 @@ const char *GuiIconText(int iconId, const char *text)
}
else
{
- sprintf(iconBuffer, "#%03i#", iconId & 0x1ff);
+ sprintf(iconBuffer, "#%03i#", iconId);
return iconBuffer;
}
@@ -4876,7 +4874,7 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint
else
{
- // TODO: There are multiple types of spaces in Unicode,
+ // TODO: There are multiple types of spaces in Unicode,
// maybe it's a good idea to add support for more: http://jkorpela.fi/chars/spaces.html
if ((codepoint != ' ') && (codepoint != '\t')) // Do not draw codepoints with no glyph
{
@@ -4888,7 +4886,7 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
}
}
- else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD))
+ else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD))
{
// Draw only glyphs inside the bounds
if ((textBoundsPosition.y + textOffsetY) <= (textBounds.y + textBounds.height - GuiGetStyle(DEFAULT, TEXT_SIZE)))
diff --git a/raylib/examples/shapes/shapes_bouncing_ball.c b/raylib/examples/shapes/shapes_bouncing_ball.c
index 203d88a..38fade6 100644
--- a/raylib/examples/shapes/shapes_bouncing_ball.c
+++ b/raylib/examples/shapes/shapes_bouncing_ball.c
@@ -67,9 +67,6 @@ int main(void)
// On pause, we draw a blinking message
if (pause && ((framesCounter/30)%2)) DrawText("PAUSED", 350, 200, 30, GRAY);
- DrawCircle(400.5, 300.5, 50, BLACK);
- DrawCircle(528.0, 172.0, 26, BLACK);
-
DrawFPS(10, 10);
EndDrawing();
diff --git a/raylib/examples/shapes/shapes_draw_circle_sector.c b/raylib/examples/shapes/shapes_draw_circle_sector.c
index 1c283e1..90e8e6a 100644
--- a/raylib/examples/shapes/shapes_draw_circle_sector.c
+++ b/raylib/examples/shapes/shapes_draw_circle_sector.c
@@ -70,7 +70,7 @@ int main(void)
GuiSliderBar((Rectangle){ 600, 170, 120, 20}, "Segments", NULL, &segments, 0, 100);
//------------------------------------------------------------------------------
- minSegments = (int)ceilf((endAngle - startAngle) / 90);
+ minSegments = truncf(ceilf((endAngle - startAngle) / 90));
DrawText(TextFormat("MODE: %s", (segments >= minSegments)? "MANUAL" : "AUTO"), 600, 200, 10, (segments >= minSegments)? MAROON : DARKGRAY);
DrawFPS(10, 10);
diff --git a/raylib/examples/shapes/shapes_lines_bezier.c b/raylib/examples/shapes/shapes_lines_bezier.c
index f015768..aaad680 100644
--- a/raylib/examples/shapes/shapes_lines_bezier.c
+++ b/raylib/examples/shapes/shapes_lines_bezier.c
@@ -26,11 +26,10 @@ int main(void)
SetConfigFlags(FLAG_MSAA_4X_HINT);
InitWindow(screenWidth, screenHeight, "raylib [shapes] example - cubic-bezier lines");
- Vector2 start = { 0, 0 };
- Vector2 end = { (float)screenWidth, (float)screenHeight };
-
- Vector2 startControl = { 100, 0 };
- Vector2 endControl = { GetScreenWidth() - 100, GetScreenHeight() };
+ Vector2 startPoint = { 30, 30 };
+ Vector2 endPoint = { (float)screenWidth - 30, (float)screenHeight - 30 };
+ bool moveStartPoint = false;
+ bool moveEndPoint = false;
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -40,15 +39,21 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
- if (IsKeyDown(KEY_LEFT_CONTROL))
+ Vector2 mouse = GetMousePosition();
+
+ if (CheckCollisionPointCircle(mouse, startPoint, 10.0f) && IsMouseButtonDown(MOUSE_BUTTON_LEFT)) moveStartPoint = true;
+ else if (CheckCollisionPointCircle(mouse, endPoint, 10.0f) && IsMouseButtonDown(MOUSE_BUTTON_LEFT)) moveEndPoint = true;
+
+ if (moveStartPoint)
{
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) startControl = GetMousePosition();
- else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) endControl = GetMousePosition();
+ startPoint = mouse;
+ if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) moveStartPoint = false;
}
- else
+
+ if (moveEndPoint)
{
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) start = GetMousePosition();
- else if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) end = GetMousePosition();
+ endPoint = mouse;
+ if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT)) moveEndPoint = false;
}
//----------------------------------------------------------------------------------
@@ -58,16 +63,14 @@ int main(void)
ClearBackground(RAYWHITE);
- DrawText("USE MOUSE LEFT-RIGHT CLICK to DEFINE LINE START and END POINTS", 15, 20, 20, GRAY);
+ DrawText("MOVE START-END POINTS WITH MOUSE", 15, 20, 20, GRAY);
- //DrawLineBezier(start, end, 2.0f, RED);
-
- DrawLineBezierCubic(start, end, startControl, endControl, 2.0f, RED);
+ // Draw line Cubic Bezier, in-out interpolation (easing), no control points
+ DrawLineBezier(startPoint, endPoint, 4.0f, BLUE);
- DrawLineEx(start, startControl, 1.0, LIGHTGRAY);
- DrawLineEx(end, endControl, 1.0, LIGHTGRAY);
- DrawCircleV(startControl, 10, RED);
- DrawCircleV(endControl, 10, RED);
+ // Draw start-end spline circles with some details
+ DrawCircleV(startPoint, CheckCollisionPointCircle(mouse, startPoint, 10.0f)? 14 : 8, moveStartPoint? RED : BLUE);
+ DrawCircleV(endPoint, CheckCollisionPointCircle(mouse, endPoint, 10.0f)? 14 : 8, moveEndPoint? RED : BLUE);
EndDrawing();
//----------------------------------------------------------------------------------
diff --git a/raylib/examples/shapes/shapes_lines_bezier.png b/raylib/examples/shapes/shapes_lines_bezier.png
index 390a49a..aa5edf3 100644
--- a/raylib/examples/shapes/shapes_lines_bezier.png
+++ b/raylib/examples/shapes/shapes_lines_bezier.png
Binary files differ
diff --git a/raylib/examples/shapes/shapes_lines_splines.c b/raylib/examples/shapes/shapes_lines_splines.c
deleted file mode 100644
index c020c60..0000000
--- a/raylib/examples/shapes/shapes_lines_splines.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************************
-*
-* raylib [shapes] example - splines drawing
-*
-* Example originally created with raylib 4.6-dev, last time updated with raylib 4.6-dev
-*
-* 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 Ramon Santamaria (@raysan5)
-*
-********************************************************************************************/
-
-#include "raylib.h"
-
-#define MAX_CONTROL_POINTS 32
-
-typedef struct {
- Vector2 start;
- Vector2 end;
-} ControlPoint;
-
-//------------------------------------------------------------------------------------
-// Program main entry point
-//------------------------------------------------------------------------------------
-int main(void)
-{
- // Initialization
- //--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
-
- SetConfigFlags(FLAG_MSAA_4X_HINT);
- InitWindow(screenWidth, screenHeight, "raylib [shapes] example - splines drawing");
-
- Vector2 points[MAX_CONTROL_POINTS] = {
- { 100.0f, 200.0f },
- { 300.0f, 400.0f },
- { 500.0f, 300.0f },
- { 700.0f, 100.0f },
- { 200.0f, 100.0f },
- };
-
- int pointCount = 5;
- int selectedPoint = -1;
-
- int splineType = 0; // 0-Linear, 1-BSpline, 2-CatmullRom, 3-Bezier
-
- // Cubic Bezier control points
- ControlPoint control[MAX_CONTROL_POINTS] = { 0 };
- for (int i = 0; i < pointCount - 1; i++)
- {
- control[i].start = points[i];
- control[i].end = points[i + 1];
- }
-
- SetTargetFPS(60); // Set our game to run at 60 frames-per-second
- //--------------------------------------------------------------------------------------
-
- // Main game loop
- while (!WindowShouldClose()) // Detect window close button or ESC key
- {
- // Update
- //----------------------------------------------------------------------------------
- // Points movement logic
- if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON) && (pointCount < MAX_CONTROL_POINTS))
- {
- points[pointCount] = GetMousePosition();
- pointCount++;
- }
-
- for (int i = 0; i < pointCount; i++)
- {
- if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) && CheckCollisionPointCircle(GetMousePosition(), points[i], 6.0f))
- {
- selectedPoint = i;
- break;
- }
- }
-
- if (selectedPoint >= 0)
- {
- points[selectedPoint] = GetMousePosition();
- if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) selectedPoint = -1;
- }
-
- // TODO: Cubic Bezier spline control points logic
-
-
- // Spline selection logic
- if (IsKeyPressed(KEY_ONE)) splineType = 0;
- else if (IsKeyPressed(KEY_TWO)) splineType = 1;
- else if (IsKeyPressed(KEY_THREE)) splineType = 2;
- else if (IsKeyPressed(KEY_FOUR)) splineType = 3;
- //----------------------------------------------------------------------------------
-
- // Draw
- //----------------------------------------------------------------------------------
- BeginDrawing();
-
- ClearBackground(RAYWHITE);
-
- if (splineType == 0) // Linear
- {
- // Draw linear spline
- for (int i = 0; i < pointCount - 1; i++)
- {
- DrawLineEx(points[i], points[i + 1], 2.0f, RED);
- }
- }
- else if (splineType == 1) // B-Spline
- {
- // Draw b-spline
- DrawLineBSpline(points, pointCount, 2.0f, RED);
- //for (int i = 0; i < (pointCount - 3); i++) DrawLineBSplineSegment(points[i], points[i + 1], points[i + 2], points[i + 3], 24.0f, BLUE);
- }
- else if (splineType == 2) // CatmullRom Spline
- {
- // Draw spline: catmull-rom
- DrawLineCatmullRom(points, pointCount, 2.0f, RED);
- //for (int i = 0; i < (pointCount - 3); i++) DrawLineCatmullRomSegment(points[i], points[i + 1], points[i + 2], points[i + 3], 24.0f, Fade(BLUE, 0.4f));
- }
- else if (splineType == 3) // Cubic Bezier
- {
- // Draw line bezier cubic (with control points)
- for (int i = 0; i < pointCount - 1; i++)
- {
- DrawLineBezierCubic(points[i], points[i + 1], control[i].start, control[i + 1].end, 2.0f, RED);
-
- // TODO: Every cubic bezier point should have two control points
- DrawCircleV(control[i].start, 4, GOLD);
- DrawCircleV(control[i].end, 4, GOLD);
- DrawLineEx(points[i], control[i].start, 1.0, LIGHTGRAY);
- DrawLineEx(points[i + 1], control[i].end, 1.0, LIGHTGRAY);
- }
- }
-
- // Draw control points
- for (int i = 0; i < pointCount; i++)
- {
- DrawCircleV(points[i], 6.0f, RED);
- if ((splineType != 0) && (i < pointCount - 1)) DrawLineV(points[i], points[i + 1], GRAY);
- }
-
- EndDrawing();
- //----------------------------------------------------------------------------------
- }
-
- // De-Initialization
- //--------------------------------------------------------------------------------------
- CloseWindow(); // Close window and OpenGL context
- //--------------------------------------------------------------------------------------
-
- return 0;
-} \ No newline at end of file
diff --git a/raylib/examples/shapes/shapes_splines_drawing.c b/raylib/examples/shapes/shapes_splines_drawing.c
new file mode 100644
index 0000000..8df5f09
--- /dev/null
+++ b/raylib/examples/shapes/shapes_splines_drawing.c
@@ -0,0 +1,247 @@
+/*******************************************************************************************
+*
+* raylib [shapes] example - splines drawing
+*
+* Example originally created with raylib 5.0, last time updated with raylib 5.0
+*
+* 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 Ramon Santamaria (@raysan5)
+*
+********************************************************************************************/
+
+#include "raylib.h"
+
+#define RAYGUI_IMPLEMENTATION
+#include "raygui.h" // Required for UI controls
+
+#include <stdlib.h> // Required for: NULL
+
+#define MAX_SPLINE_POINTS 32
+
+// Cubic Bezier spline control points
+// NOTE: Every segment has two control points
+typedef struct {
+ Vector2 start;
+ Vector2 end;
+} ControlPoint;
+
+// Spline types
+typedef enum {
+ SPLINE_LINEAR = 0, // Linear
+ SPLINE_BASIS, // B-Spline
+ SPLINE_CATMULLROM, // Catmull-Rom
+ SPLINE_BEZIER // Cubic Bezier
+} SplineType;
+
+//------------------------------------------------------------------------------------
+// Program main entry point
+//------------------------------------------------------------------------------------
+int main(void)
+{
+ // Initialization
+ //--------------------------------------------------------------------------------------
+ const int screenWidth = 800;
+ const int screenHeight = 450;
+
+ SetConfigFlags(FLAG_MSAA_4X_HINT);
+ InitWindow(screenWidth, screenHeight, "raylib [shapes] example - splines drawing");
+
+ Vector2 points[MAX_SPLINE_POINTS] = {
+ { 50.0f, 400.0f },
+ { 160.0f, 220.0f },
+ { 340.0f, 380.0f },
+ { 520.0f, 60.0f },
+ { 710.0f, 260.0f },
+ };
+
+ int pointCount = 5;
+ int selectedPoint = -1;
+ int focusedPoint = -1;
+ Vector2 *selectedControlPoint = NULL;
+ Vector2 *focusedControlPoint = NULL;
+
+ // Cubic Bezier control points initialization
+ ControlPoint control[MAX_SPLINE_POINTS] = { 0 };
+ for (int i = 0; i < pointCount - 1; i++)
+ {
+ control[i].start = (Vector2){ points[i].x + 50, points[i].y };
+ control[i].end = (Vector2){ points[i + 1].x - 50, points[i + 1].y };
+ }
+
+ // Spline config variables
+ float splineThickness = 8.0f;
+ int splineTypeActive = SPLINE_LINEAR; // 0-Linear, 1-BSpline, 2-CatmullRom, 3-Bezier
+ bool splineTypeEditMode = false;
+ bool splineHelpersActive = true;
+
+ SetTargetFPS(60); // Set our game to run at 60 frames-per-second
+ //--------------------------------------------------------------------------------------
+
+ // Main game loop
+ while (!WindowShouldClose()) // Detect window close button or ESC key
+ {
+ // Update
+ //----------------------------------------------------------------------------------
+ // Spline points creation logic (at the end of spline)
+ if (IsMouseButtonPressed(MOUSE_RIGHT_BUTTON) && (pointCount < MAX_SPLINE_POINTS))
+ {
+ points[pointCount] = GetMousePosition();
+ pointCount++;
+ }
+
+ // Spline point focus and selection logic
+ for (int i = 0; i < pointCount; i++)
+ {
+ if (CheckCollisionPointCircle(GetMousePosition(), points[i], 8.0f))
+ {
+ focusedPoint = i;
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) selectedPoint = i;
+ break;
+ }
+ else focusedPoint = -1;
+ }
+
+ // Spline point movement logic
+ if (selectedPoint >= 0)
+ {
+ points[selectedPoint] = GetMousePosition();
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) selectedPoint = -1;
+ }
+
+ // Cubic Bezier spline control points logic
+ if ((splineTypeActive == SPLINE_BEZIER) && (focusedPoint == -1))
+ {
+ // Spline control point focus and selection logic
+ for (int i = 0; i < pointCount; i++)
+ {
+ if (CheckCollisionPointCircle(GetMousePosition(), control[i].start, 6.0f))
+ {
+ focusedControlPoint = &control[i].start;
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) selectedControlPoint = &control[i].start;
+ break;
+ }
+ else if (CheckCollisionPointCircle(GetMousePosition(), control[i].end, 6.0f))
+ {
+ focusedControlPoint = &control[i].end;
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) selectedControlPoint = &control[i].end;
+ break;
+ }
+ else focusedControlPoint = NULL;
+ }
+
+ // Spline control point movement logic
+ if (selectedControlPoint != NULL)
+ {
+ *selectedControlPoint = GetMousePosition();
+ if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) selectedControlPoint = NULL;
+ }
+ }
+
+ // Spline selection logic
+ if (IsKeyPressed(KEY_ONE)) splineTypeActive = 0;
+ else if (IsKeyPressed(KEY_TWO)) splineTypeActive = 1;
+ else if (IsKeyPressed(KEY_THREE)) splineTypeActive = 2;
+ else if (IsKeyPressed(KEY_FOUR)) splineTypeActive = 3;
+ //----------------------------------------------------------------------------------
+
+ // Draw
+ //----------------------------------------------------------------------------------
+ BeginDrawing();
+
+ ClearBackground(RAYWHITE);
+
+ if (splineTypeActive == SPLINE_LINEAR)
+ {
+ // Draw spline: linear
+ DrawSplineLinear(points, pointCount, splineThickness, RED);
+ }
+ else if (splineTypeActive == SPLINE_BASIS)
+ {
+ // Draw spline: basis
+ DrawSplineBasis(points, pointCount, splineThickness, RED); // Provide connected points array
+
+ /*
+ for (int i = 0; i < (pointCount - 3); i++)
+ {
+ // Drawing individual segments, not considering thickness connection compensation
+ DrawSplineSegmentBasis(points[i], points[i + 1], points[i + 2], points[i + 3], splineThickness, MAROON);
+ }
+ */
+ }
+ else if (splineTypeActive == SPLINE_CATMULLROM)
+ {
+ // Draw spline: catmull-rom
+ DrawSplineCatmullRom(points, pointCount, splineThickness, RED); // Provide connected points array
+
+ /*
+ for (int i = 0; i < (pointCount - 3); i++)
+ {
+ // Drawing individual segments, not considering thickness connection compensation
+ DrawSplineSegmentCatmullRom(points[i], points[i + 1], points[i + 2], points[i + 3], splineThickness, MAROON);
+ }
+ */
+ }
+ else if (splineTypeActive == SPLINE_BEZIER)
+ {
+ // Draw spline: cubic-bezier (with control points)
+ for (int i = 0; i < pointCount - 1; i++)
+ {
+ // Drawing individual segments, not considering thickness connection compensation
+ DrawSplineSegmentBezierCubic(points[i], control[i].start, control[i].end, points[i + 1], splineThickness, RED);
+
+ // Every cubic bezier point should have two control points
+ DrawCircleV(control[i].start, 6, GOLD);
+ DrawCircleV(control[i].end, 6, GOLD);
+ if (focusedControlPoint == &control[i].start) DrawCircleV(control[i].start, 8, GREEN);
+ else if (focusedControlPoint == &control[i].end) DrawCircleV(control[i].end, 8, GREEN);
+ DrawLineEx(points[i], control[i].start, 1.0f, LIGHTGRAY);
+ DrawLineEx(points[i + 1], control[i].end, 1.0f, LIGHTGRAY);
+
+ // Draw spline control lines
+ DrawLineV(points[i], control[i].start, GRAY);
+ //DrawLineV(control[i].start, control[i].end, LIGHTGRAY);
+ DrawLineV(control[i].end, points[i + 1], GRAY);
+ }
+ }
+
+ if (splineHelpersActive)
+ {
+ // Draw spline point helpers
+ for (int i = 0; i < pointCount; i++)
+ {
+ DrawCircleLinesV(points[i], (focusedPoint == i)? 12.0f : 8.0f, (focusedPoint == i)? BLUE: DARKBLUE);
+ if ((splineTypeActive != SPLINE_LINEAR) &&
+ (splineTypeActive != SPLINE_BEZIER) &&
+ (i < pointCount - 1)) DrawLineV(points[i], points[i + 1], GRAY);
+
+ DrawText(TextFormat("[%.0f, %.0f]", points[i].x, points[i].y), points[i].x, points[i].y + 10, 10, BLACK);
+ }
+ }
+
+ // Check all possible UI states that require controls lock
+ if (splineTypeEditMode) GuiLock();
+
+ // Draw spline config
+ GuiLabel((Rectangle){ 12, 62, 140, 24 }, TextFormat("Spline thickness: %i", (int)splineThickness));
+ GuiSliderBar((Rectangle){ 12, 60 + 24, 140, 16 }, NULL, NULL, &splineThickness, 1.0f, 40.0f);
+
+ GuiCheckBox((Rectangle){ 12, 110, 20, 20 }, "Show point helpers", &splineHelpersActive);
+
+ GuiUnlock();
+
+ GuiLabel((Rectangle){ 12, 10, 140, 24 }, "Spline type:");
+ if (GuiDropdownBox((Rectangle){ 12, 8 + 24, 140, 28 }, "LINEAR;BSPLINE;CATMULLROM;BEZIER", &splineTypeActive, splineTypeEditMode)) splineTypeEditMode = !splineTypeEditMode;
+
+ EndDrawing();
+ //----------------------------------------------------------------------------------
+ }
+
+ // De-Initialization
+ //--------------------------------------------------------------------------------------
+ CloseWindow(); // Close window and OpenGL context
+ //--------------------------------------------------------------------------------------
+
+ return 0;
+} \ No newline at end of file
diff --git a/raylib/examples/shapes/shapes_splines_drawing.png b/raylib/examples/shapes/shapes_splines_drawing.png
new file mode 100644
index 0000000..686f04c
--- /dev/null
+++ b/raylib/examples/shapes/shapes_splines_drawing.png
Binary files differ
diff --git a/raylib/examples/shapes/shapes_top_down_lights.c b/raylib/examples/shapes/shapes_top_down_lights.c
index b09137c..f22cf3c 100644
--- a/raylib/examples/shapes/shapes_top_down_lights.c
+++ b/raylib/examples/shapes/shapes_top_down_lights.c
@@ -335,6 +335,7 @@ int main(void)
DrawFPS(screenWidth - 80, 10);
DrawText("Drag to move light #1", 10, 10, 10, DARKGREEN);
DrawText("Right click to add new light", 10, 30, 10, DARKGREEN);
+
EndDrawing();
//----------------------------------------------------------------------------------
}
diff --git a/raylib/examples/text/text_font_sdf.c b/raylib/examples/text/text_font_sdf.c
index cba47b4..40a3fa4 100644
--- a/raylib/examples/text/text_font_sdf.c
+++ b/raylib/examples/text/text_font_sdf.c
@@ -38,7 +38,7 @@ int main(void)
const char msg[50] = "Signed Distance Fields";
// Loading file to memory
- unsigned int fileSize = 0;
+ int fileSize = 0;
unsigned char *fileData = LoadFileData("resources/anonymous_pro_bold.ttf", &fileSize);
// Default font generation from TTF font
diff --git a/raylib/examples/text/text_unicode.c b/raylib/examples/text/text_unicode.c
index b25e327..42227f8 100644
--- a/raylib/examples/text/text_unicode.c
+++ b/raylib/examples/text/text_unicode.c
@@ -195,7 +195,7 @@ int main(void)
}
Vector2 mouse = GetMousePosition();
- Vector2 pos = { 28.8f, 10.0f };
+ Vector2 position = { 28.8f, 10.0f };
hovered = -1;
//----------------------------------------------------------------------------------
@@ -210,21 +210,21 @@ int main(void)
for (int i = 0; i < SIZEOF(emoji); ++i)
{
const char *txt = &emojiCodepoints[emoji[i].index];
- Rectangle emojiRect = { pos.x, pos.y, (float)fontEmoji.baseSize, (float)fontEmoji.baseSize };
+ Rectangle emojiRect = { position.x, position.y, (float)fontEmoji.baseSize, (float)fontEmoji.baseSize };
if (!CheckCollisionPointRec(mouse, emojiRect))
{
- DrawTextEx(fontEmoji, txt, pos, (float)fontEmoji.baseSize, 1.0f, selected == i ? emoji[i].color : Fade(LIGHTGRAY, 0.4f));
+ DrawTextEx(fontEmoji, txt, position, (float)fontEmoji.baseSize, 1.0f, selected == i ? emoji[i].color : Fade(LIGHTGRAY, 0.4f));
}
else
{
- DrawTextEx(fontEmoji, txt, pos, (float)fontEmoji.baseSize, 1.0f, emoji[i].color );
+ DrawTextEx(fontEmoji, txt, position, (float)fontEmoji.baseSize, 1.0f, emoji[i].color );
hovered = i;
- hoveredPos = pos;
+ hoveredPos = position;
}
- if ((i != 0) && (i%EMOJI_PER_WIDTH == 0)) { pos.y += fontEmoji.baseSize + 24.25f; pos.x = 28.8f; }
- else pos.x += fontEmoji.baseSize + 28.8f;
+ if ((i != 0) && (i%EMOJI_PER_WIDTH == 0)) { position.y += fontEmoji.baseSize + 24.25f; position.x = 28.8f; }
+ else position.x += fontEmoji.baseSize + 28.8f;
}
//------------------------------------------------------------------------------
@@ -282,8 +282,8 @@ int main(void)
int length = GetCodepointCount(messages[message].text);
const char *info = TextFormat("%s %u characters %i bytes", messages[message].language, length, size);
sz = MeasureTextEx(GetFontDefault(), info, 10, 1.0f);
- Vector2 pos = { textRect.x + textRect.width - sz.x, msgRect.y + msgRect.height - sz.y - 2 };
- DrawText(info, (int)pos.x, (int)pos.y, 10, RAYWHITE);
+
+ DrawText(info, (int)(textRect.x + textRect.width - sz.x), (int)(msgRect.y + msgRect.height - sz.y - 2), 10, RAYWHITE);
}
//------------------------------------------------------------------------------
diff --git a/raylib/examples/textures/textures_textured_curve.c b/raylib/examples/textures/textures_textured_curve.c
index 3c2f060..cf426be 100644
--- a/raylib/examples/textures/textures_textured_curve.c
+++ b/raylib/examples/textures/textures_textured_curve.c
@@ -13,7 +13,6 @@
*
********************************************************************************************/
-
#include "raylib.h"
#include "raymath.h"
@@ -43,12 +42,8 @@ static Vector2 *curveSelectedPoint = NULL;
//----------------------------------------------------------------------------------
// Module Functions Declaration
//----------------------------------------------------------------------------------
-static void UpdateOptions(void);
-static void UpdateCurve(void);
-static void DrawCurve(void);
static void DrawTexturedCurve(void);
-
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
@@ -81,9 +76,31 @@ int main()
{
// Update
//----------------------------------------------------------------------------------
- UpdateCurve();
- UpdateOptions();
-
+ // Curve config options
+ if (IsKeyPressed(KEY_SPACE)) showCurve = !showCurve;
+ if (IsKeyPressed(KEY_EQUAL)) curveWidth += 2;
+ if (IsKeyPressed(KEY_MINUS)) curveWidth -= 2;
+ if (curveWidth < 2) curveWidth = 2;
+
+ // Update segments
+ if (IsKeyPressed(KEY_LEFT)) curveSegments -= 2;
+ if (IsKeyPressed(KEY_RIGHT)) curveSegments += 2;
+
+ if (curveSegments < 2) curveSegments = 2;
+
+ // Update curve logic
+ // If the mouse is not down, we are not editing the curve so clear the selection
+ if (!IsMouseButtonDown(MOUSE_LEFT_BUTTON)) curveSelectedPoint = NULL;
+
+ // If a point was selected, move it
+ if (curveSelectedPoint) *curveSelectedPoint = Vector2Add(*curveSelectedPoint, GetMouseDelta());
+
+ // The mouse is down, and nothing was selected, so see if anything was picked
+ Vector2 mouse = GetMousePosition();
+ if (CheckCollisionPointCircle(mouse, curveStartPosition, 6)) curveSelectedPoint = &curveStartPosition;
+ else if (CheckCollisionPointCircle(mouse, curveStartPositionTangent, 6)) curveSelectedPoint = &curveStartPositionTangent;
+ else if (CheckCollisionPointCircle(mouse, curveEndPosition, 6)) curveSelectedPoint = &curveEndPosition;
+ else if (CheckCollisionPointCircle(mouse, curveEndPositionTangent, 6)) curveSelectedPoint = &curveEndPositionTangent;
//----------------------------------------------------------------------------------
// Draw
@@ -92,9 +109,29 @@ int main()
ClearBackground(RAYWHITE);
- DrawTexturedCurve();
- DrawCurve();
-
+ DrawTexturedCurve(); // Draw a textured Spline Cubic Bezier
+
+ // Draw spline for reference
+ if (showCurve) DrawSplineSegmentBezierCubic(curveStartPosition, curveEndPosition, curveStartPositionTangent, curveEndPositionTangent, 2, BLUE);
+
+ // Draw the various control points and highlight where the mouse is
+ DrawLineV(curveStartPosition, curveStartPositionTangent, SKYBLUE);
+ DrawLineV(curveStartPositionTangent, curveEndPositionTangent, Fade(LIGHTGRAY, 0.4f));
+ DrawLineV(curveEndPosition, curveEndPositionTangent, PURPLE);
+
+ if (CheckCollisionPointCircle(mouse, curveStartPosition, 6)) DrawCircleV(curveStartPosition, 7, YELLOW);
+ DrawCircleV(curveStartPosition, 5, RED);
+
+ if (CheckCollisionPointCircle(mouse, curveStartPositionTangent, 6)) DrawCircleV(curveStartPositionTangent, 7, YELLOW);
+ DrawCircleV(curveStartPositionTangent, 5, MAROON);
+
+ if (CheckCollisionPointCircle(mouse, curveEndPosition, 6)) DrawCircleV(curveEndPosition, 7, YELLOW);
+ DrawCircleV(curveEndPosition, 5, GREEN);
+
+ if (CheckCollisionPointCircle(mouse, curveEndPositionTangent, 6)) DrawCircleV(curveEndPositionTangent, 7, YELLOW);
+ DrawCircleV(curveEndPositionTangent, 5, DARKGREEN);
+
+ // Draw usage info
DrawText("Drag points to move curve, press SPACE to show/hide base curve", 10, 10, 10, DARKGRAY);
DrawText(TextFormat("Curve width: %2.0f (Use + and - to adjust)", curveWidth), 10, 30, 10, DARKGRAY);
DrawText(TextFormat("Curve segments: %d (Use LEFT and RIGHT to adjust)", curveSegments), 10, 50, 10, DARKGRAY);
@@ -116,53 +153,8 @@ int main()
//----------------------------------------------------------------------------------
// Module Functions Definition
//----------------------------------------------------------------------------------
-static void DrawCurve(void)
-{
- if (showCurve) DrawLineBezierCubic(curveStartPosition, curveEndPosition, curveStartPositionTangent, curveEndPositionTangent, 2, BLUE);
-
- // Draw the various control points and highlight where the mouse is
- DrawLineV(curveStartPosition, curveStartPositionTangent, SKYBLUE);
- DrawLineV(curveEndPosition, curveEndPositionTangent, PURPLE);
- Vector2 mouse = GetMousePosition();
-
- if (CheckCollisionPointCircle(mouse, curveStartPosition, 6)) DrawCircleV(curveStartPosition, 7, YELLOW);
- DrawCircleV(curveStartPosition, 5, RED);
-
- if (CheckCollisionPointCircle(mouse, curveStartPositionTangent, 6)) DrawCircleV(curveStartPositionTangent, 7, YELLOW);
- DrawCircleV(curveStartPositionTangent, 5, MAROON);
-
- if (CheckCollisionPointCircle(mouse, curveEndPosition, 6)) DrawCircleV(curveEndPosition, 7, YELLOW);
- DrawCircleV(curveEndPosition, 5, GREEN);
-
- if (CheckCollisionPointCircle(mouse, curveEndPositionTangent, 6)) DrawCircleV(curveEndPositionTangent, 7, YELLOW);
- DrawCircleV(curveEndPositionTangent, 5, DARKGREEN);
-}
-
-static void UpdateCurve(void)
-{
- // If the mouse is not down, we are not editing the curve so clear the selection
- if (!IsMouseButtonDown(MOUSE_LEFT_BUTTON))
- {
- curveSelectedPoint = NULL;
- return;
- }
-
- // If a point was selected, move it
- if (curveSelectedPoint)
- {
- *curveSelectedPoint = Vector2Add(*curveSelectedPoint, GetMouseDelta());
- return;
- }
-
- // The mouse is down, and nothing was selected, so see if anything was picked
- Vector2 mouse = GetMousePosition();
-
- if (CheckCollisionPointCircle(mouse, curveStartPosition, 6)) curveSelectedPoint = &curveStartPosition;
- else if (CheckCollisionPointCircle(mouse, curveStartPositionTangent, 6)) curveSelectedPoint = &curveStartPositionTangent;
- else if (CheckCollisionPointCircle(mouse, curveEndPosition, 6)) curveSelectedPoint = &curveEndPosition;
- else if (CheckCollisionPointCircle(mouse, curveEndPositionTangent, 6)) curveSelectedPoint = &curveEndPositionTangent;
-}
+// Draw textured curve using Spline Cubic Bezier
static void DrawTexturedCurve(void)
{
const float step = 1.0f/curveSegments;
@@ -179,11 +171,11 @@ static void DrawTexturedCurve(void)
for (int i = 1; i <= curveSegments; i++)
{
- // Segment the curve
- t = step*i;
- float a = powf(1 - t, 3);
- float b = 3*powf(1 - t, 2)*t;
- float c = 3*(1 - t)*powf(t, 2);
+ t = step*(float)i;
+
+ float a = powf(1.0f - t, 3);
+ float b = 3.0f*powf(1.0f - t, 2)*t;
+ float c = 3.0f*(1.0f - t)*powf(t, 2);
float d = powf(t, 3);
// Compute the endpoint for this segment
@@ -216,22 +208,20 @@ static void DrawTexturedCurve(void)
// Draw the segment as a quad
rlSetTexture(texRoad.id);
rlBegin(RL_QUADS);
+ rlColor4ub(255,255,255,255);
+ rlNormal3f(0.0f, 0.0f, 1.0f);
- rlColor4ub(255,255,255,255);
- rlNormal3f(0.0f, 0.0f, 1.0f);
-
- rlTexCoord2f(0, previousV);
- rlVertex2f(prevNegNormal.x, prevNegNormal.y);
-
- rlTexCoord2f(1, previousV);
- rlVertex2f(prevPosNormal.x, prevPosNormal.y);
+ rlTexCoord2f(0, previousV);
+ rlVertex2f(prevNegNormal.x, prevNegNormal.y);
- rlTexCoord2f(1, v);
- rlVertex2f(currentPosNormal.x, currentPosNormal.y);
+ rlTexCoord2f(1, previousV);
+ rlVertex2f(prevPosNormal.x, prevPosNormal.y);
- rlTexCoord2f(0, v);
- rlVertex2f(currentNegNormal.x, currentNegNormal.y);
+ rlTexCoord2f(1, v);
+ rlVertex2f(currentPosNormal.x, currentPosNormal.y);
+ rlTexCoord2f(0, v);
+ rlVertex2f(currentNegNormal.x, currentNegNormal.y);
rlEnd();
// The current step is the start of the next step
@@ -241,19 +231,3 @@ static void DrawTexturedCurve(void)
}
}
-static void UpdateOptions(void)
-{
- if (IsKeyPressed(KEY_SPACE)) showCurve = !showCurve;
-
- // Update with
- if (IsKeyPressed(KEY_EQUAL)) curveWidth += 2;
- if (IsKeyPressed(KEY_MINUS)) curveWidth -= 2;
-
- if (curveWidth < 2) curveWidth = 2;
-
- // Update segments
- if (IsKeyPressed(KEY_LEFT)) curveSegments -= 2;
- if (IsKeyPressed(KEY_RIGHT)) curveSegments += 2;
-
- if (curveSegments < 2) curveSegments = 2;
-}