diff --git a/examples/Makefile b/examples/Makefile deleted file mode 100644 index acfcb0857..000000000 --- a/examples/Makefile +++ /dev/null @@ -1,794 +0,0 @@ -#************************************************************************************************** -# -# raylib makefile for multiple platforms -# -# This file supports building raylib examples for the following platforms: -# -# > PLATFORM_DESKTOP -# - Defaults to PLATFORM_DESKTOP_GLFW -# > PLATFORM_DESKTOP_GFLW (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_DESKTOP_RGFW (RGFW backend): -# - Windows (Win32, Win64) -# - Linux (X11 desktop mode) -# - macOS/OSX (x64, arm64 (not tested)) -# - Others (not tested) -# > PLATFORM_WEB_RGFW: -# - HTML5 (WebAssembly) -# > 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-2026 Ramon Santamaria (@raysan5) -# -# This software is provided "as-is", without any express or implied warranty. In no event -# will the authors be held liable for any damages arising from the use of this software. -# -# Permission is granted to anyone to use this software for any purpose, including commercial -# applications, and to alter it and redistribute it freely, subject to the following restrictions: -# -# 1. The origin of this software must not be misrepresented; you must not claim that you -# wrote the original software. If you use this software in a product, an acknowledgment -# in the product documentation would be appreciated but is not required. -# -# 2. Altered source versions must be plainly marked as such, and must not be misrepresented -# as being the original software. -# -# 3. This notice may not be removed or altered from any source distribution. -# -#************************************************************************************************** - -.PHONY: all clean - -# Define required environment variables -#------------------------------------------------------------------------------------------------ -# Define target platform: PLATFORM_DESKTOP, PLATFORM_DESKTOP_SDL, PLATFORM_DRM, PLATFORM_ANDROID, PLATFORM_WEB, PLATFORM_WEB_RGFW -PLATFORM ?= PLATFORM_DESKTOP - -ifeq ($(PLATFORM),$(filter $(PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW)) - TARGET_PLATFORM := $(PLATFORM) - override PLATFORM = PLATFORM_DESKTOP -else - ifeq ($(PLATFORM), PLATFORM_DESKTOP) - TARGET_PLATFORM = PLATFORM_DESKTOP_GLFW - else - TARGET_PLATFORM = $(PLATFORM) - endif -endif - -# Define required raylib variables -PROJECT_NAME ?= raylib_examples -RAYLIB_VERSION ?= 5.5.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 -DESTDIR ?= /usr/local -RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include -RAYLIB_LIB_PATH ?= $(DESTDIR)/lib - -# Library type compilation: STATIC (.a) or SHARED (.so/.dll) -RAYLIB_LIBTYPE ?= STATIC - -# Build mode for project: DEBUG or RELEASE -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/include -SDL_LIBRARY_PATH ?= $(RAYLIB_SRC_PATH)/external/SDL2/lib -SDL_LIBRARIES ?= -lSDL2 -lSDL2main - -# 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 - -# PLATFORM_WEB: Default properties -BUILD_WEB_ASYNCIFY ?= TRUE -BUILD_WEB_SHELL ?= $(RAYLIB_PATH)/src/minshell.html -BUILD_WEB_HEAP_SIZE ?= 134217728 -BUILD_WEB_RESOURCES ?= TRUE -BUILD_WEB_RESOURCES_PATH ?= $(dir $<)resources@resources -# Use WebGL2 backend (OpenGL 3.0) -# WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3 -BUILD_WEB_WEBGL2 ?= FALSE - -# Determine PLATFORM_OS when required -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_WEB PLATFORM_WEB_RGFW)) - # No uname.exe on MinGW!, but OS=Windows_NT on Windows! - # ifeq ($(UNAME),Msys) -> Windows - ifeq ($(OS),Windows_NT) - PLATFORM_OS = WINDOWS - else - UNAMEOS = $(shell uname) - ifeq ($(UNAMEOS),Linux) - PLATFORM_OS = LINUX - endif - ifeq ($(UNAMEOS),FreeBSD) - PLATFORM_OS = BSD - endif - ifeq ($(UNAMEOS),OpenBSD) - PLATFORM_OS = BSD - endif - ifeq ($(UNAMEOS),NetBSD) - PLATFORM_OS = BSD - endif - ifeq ($(UNAMEOS),DragonFly) - PLATFORM_OS = BSD - endif - ifeq ($(UNAMEOS),Darwin) - PLATFORM_OS = OSX - endif - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - UNAMEOS = $(shell uname) - ifeq ($(UNAMEOS),Linux) - PLATFORM_OS = LINUX - endif -endif - -# RAYLIB_PATH adjustment for LINUX platform -# TODO: Do we really need this? -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),LINUX) - RAYLIB_PREFIX ?= .. - RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX)) - endif -endif - -# Default path for raylib on Raspberry Pi -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - RAYLIB_PATH ?= /home/pi/raylib -endif - -# Define raylib release directory for compiled library -RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src - -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - ifeq ($(PLATFORM_OS),WINDOWS) - # Emscripten required variables - EMSDK_PATH ?= C:/raylib/emsdk - EMSCRIPTEN_PATH ?= $(EMSDK_PATH)/upstream/emscripten - CLANG_PATH = $(EMSDK_PATH)/upstream/bin - PYTHON_PATH = $(EMSDK_PATH)/python/3.9.2-nuget_64bit - NODE_PATH = $(EMSDK_PATH)/node/20.18.0_64bit/bin - export PATH = $(EMSDK_PATH);$(EMSCRIPTEN_PATH);$(CLANG_PATH);$(NODE_PATH);$(PYTHON_PATH):$$(PATH) - endif -endif - -# Define default C compiler: CC -#------------------------------------------------------------------------------------------------ -CC = gcc - -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),OSX) - # OSX default compiler - CC = clang - endif - ifeq ($(PLATFORM_OS),BSD) - # FreeBSD, OpenBSD, NetBSD, DragonFly default compiler - CC = clang - endif -endif -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - # HTML5 emscripten compiler - # WARNING: To compile to HTML5, code must be redesigned - # to use emscripten.h and emscripten_set_main_loop() - CC = emcc -endif - -# Define default make program: MAKE -#------------------------------------------------------------------------------------------------ -MAKE ?= make - -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),WINDOWS) - MAKE = mingw32-make - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_ANDROID) - ifeq ($(PLATFORM_OS),WINDOWS) - MAKE = mingw32-make - endif -endif -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - ifeq ($(PLATFORM_OS),WINDOWS) - MAKE = mingw32-make - else - EMMAKE := $(shell command -v emmake) - ifneq (, $(EMMAKE)) - MAKE = $(EMMAKE) make - else - MAKE = mingw32-make - endif - endif -endif - -# Define compiler flags: CFLAGS -#------------------------------------------------------------------------------------------------ -# -O1 defines optimization level -# -g include debug information on compilation -# -s strip unnecessary data from build -# -Wall turns on most, but not all, compiler warnings -# -std=c99 defines C language mode (standard C from 1999 revision) -# -std=gnu99 defines C language mode (GNU C from 1999 revision) -# -Wno-missing-braces ignore invalid warning (GCC bug 53119) -# -Wno-unused-value ignore unused return values of some functions (i.e. fread()) -# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec -CFLAGS = -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces -Wno-unused-result - -ifeq ($(BUILD_MODE),DEBUG) - CFLAGS += -g -D_DEBUG -else - ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - ifeq ($(BUILD_WEB_ASYNCIFY),TRUE) - CFLAGS += -O3 - else - CFLAGS += -Os - endif - else - CFLAGS += -O2 - endif -endif - -# Additional flags for compiler (if desired) -# -Wextra enables some extra warning flags that are not enabled by -Wall -# -Wmissing-prototypes warn if a global function is defined without a previous prototype declaration -# -Wstrict-prototypes warn if a function is declared or defined without specifying the argument types -# -Werror=implicit-function-declaration catch function calls without prior declaration -#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),LINUX) - ifeq ($(RAYLIB_LIBTYPE),STATIC) - CFLAGS += -D_DEFAULT_SOURCE - endif - ifeq ($(RAYLIB_LIBTYPE),SHARED) - # Explicitly enable runtime link to libraylib.so - CFLAGS += -Wl,-rpath,$(RAYLIB_RELEASE_PATH) - endif - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - CFLAGS += -std=gnu99 -DEGL_NO_X11 -endif - -# Define include paths for required headers: INCLUDE_PATHS -# NOTE: Some external/extras libraries could be required (stb, easings...) -#------------------------------------------------------------------------------------------------ -INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external $(EXTRA_INCLUDE_PATHS) - -# Define additional directories containing required header files -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),BSD) - INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH) -I/usr/pkg/include -I/usr/X11R7/include - endif - ifeq ($(PLATFORM_OS),LINUX) - INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH) - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL) - INCLUDE_PATHS += -I$(SDL_INCLUDE_PATH) -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH) - INCLUDE_PATHS += -I/usr/include/libdrm -endif - -# Define library paths containing required libs: LDFLAGS -#------------------------------------------------------------------------------------------------ -LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src - -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - 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 - ifeq ($(PLATFORM_OS),LINUX) - LDFLAGS += -L$(RAYLIB_LIB_PATH) - endif - ifeq ($(PLATFORM_OS),BSD) - LDFLAGS += -Lsrc -L$(RAYLIB_LIB_PATH) - endif -endif -ifeq ($(TARGET_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 ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - # -Os # size optimization - # -O2 # optimization level 2, if used, also set --memory-init-file 0 - # -sUSE_GLFW=3 # Use glfw3 library (context/input management) - # -sALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL! - # -sTOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) (67108864 = 64MB) - # -sUSE_PTHREADS=1 # multithreading support - # -sWASM=0 # disable Web Assembly, emitted by default - # -sASYNCIFY # lets synchronous C/C++ code interact with asynchronous JS - # -sFORCE_FILESYSTEM=1 # force filesystem to load/save files data - # -sASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off) - # -sMINIFY_HTML=0 # minify generated html from shell.html - # --profiling # include information for code profiling - # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) - # --preload-file resources # specify a resources folder for data compilation - # --source-map-base # allow debugging in browser with source map - # --shell-file shell.html # define a custom shell .html and output extension - LDFLAGS += -sTOTAL_MEMORY=$(BUILD_WEB_HEAP_SIZE) -sFORCE_FILESYSTEM=1 -sEXPORTED_RUNTIME_METHODS=ccall -sMINIFY_HTML=0 - - # Using GLFW3 library (instead of RGFW) - ifeq ($(TARGET_PLATFORM),PLATFORM_WEB) - LDFLAGS += -sUSE_GLFW=3 - endif - - # Build using asyncify - ifeq ($(BUILD_WEB_ASYNCIFY),TRUE) - LDFLAGS += -sASYNCIFY - endif - - # NOTE: Flags required for WebGL 2.0 (OpenGL ES 3.0) - # WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3 - ifeq ($(BUILD_WEB_WEBGL2),TRUE) - LDFLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2 - endif - - # Add resources building if required - ifeq ($(BUILD_WEB_RESOURCES),TRUE) - LDFLAGS += --preload-file $(BUILD_WEB_RESOURCES_PATH) - endif - - # Add debug mode flags if required - ifeq ($(BUILD_MODE),DEBUG) - LDFLAGS += -sASSERTIONS=1 --profiling - endif - - # Define a custom shell .html and output extension - LDFLAGS += --shell-file $(BUILD_WEB_SHELL) - EXT = .html - - # NOTE: Simple raylib examples are compiled to be interpreter with asyncify, that way, - # we can compile same code for ALL platforms with no change required, but, working on bigger - # projects, code needs to be refactored to avoid a blocking while() loop, moving Update and Draw - # logic to a self contained function: UpdateDrawFrame(), check core_basic_window_web.c for reference. - -endif - -# Define libraries required on linking: LDLIBS -# NOTE: To link libraries (lib.so or lib.a), use -l -#------------------------------------------------------------------------------------------------ -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),WINDOWS) - # Libraries for Windows desktop compilation - # NOTE: WinMM library required to set high-res timer resolution - LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm - endif - ifeq ($(PLATFORM_OS),LINUX) - # Libraries for Debian GNU/Linux desktop compiling - # NOTE: Required packages: libegl1-mesa-dev - LDLIBS = -lraylib -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 - ifeq ($(PLATFORM_OS),OSX) - # Libraries for OSX 10.9 desktop compiling - # NOTE: Required packages: libopenal-dev libegl1-mesa-dev - LDLIBS = -lraylib -framework OpenGL -framework Cocoa -framework IOKit -framework CoreAudio -framework CoreVideo - endif - ifeq ($(PLATFORM_OS),BSD) - # Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling - # NOTE: Required packages: mesa-libs - LDFLAGS += -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib - LDLIBS = -lraylib -lGL -lm -lpthread - - # On XWindow requires also below libraries - LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor - endif - ifeq ($(USE_EXTERNAL_GLFW),TRUE) - # NOTE: It could require additional packages installed: libglfw3-dev - LDLIBS += -lglfw - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_SDL) - ifeq ($(PLATFORM_OS),WINDOWS) - # Libraries for Windows desktop compilation - LDLIBS = -lraylib $(SDL_LIBRARIES) -lopengl32 -lgdi32 - endif - ifeq ($(PLATFORM_OS),LINUX) - # Libraries for Debian GNU/Linux desktop compiling - # NOTE: Required packages: libegl1-mesa-dev - LDLIBS = -lraylib $(SDL_LIBRARIES) -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 ($(TARGET_PLATFORM),PLATFORM_DESKTOP_RGFW) - ifeq ($(PLATFORM_OS),WINDOWS) - # Libraries for Windows desktop compilation - LDFLAGS += -L..\src - LDLIBS = -lraylib -lgdi32 -lwinmm -lopengl32 - endif - ifeq ($(PLATFORM_OS),LINUX) - # Libraries for Debian GNU/Linux desktop compipling - # NOTE: Required packages: libegl1-mesa-dev - LDFLAGS += -L../src - LDLIBS = -lraylib -lGL -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lm -lpthread -ldl -lrt - - # Explicit link to libc - ifeq ($(RAYLIB_LIBTYPE),SHARED) - LDLIBS += -lc - endif - - # NOTE: On ARM 32bit arch, miniaudio requires atomics library - LDLIBS += -latomic - endif - ifeq ($(PLATFORM_OS),OSX) - # Libraries for Debian GNU/Linux desktop compiling - # NOTE: Required packages: libegl1-mesa-dev - LDFLAGS += -L../src - LDLIBS = -lraylib -lm - LDLIBS += -framework Foundation -framework AppKit -framework IOKit -framework OpenGL -framework CoreVideo - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - # Libraries for DRM compiling - # NOTE: Required packages: libasound2-dev (ALSA) - LDLIBS = -lraylib -lGLESv2 -lEGL -ldrm -lgbm -lpthread -lrt -lm -ldl -latomic - # TODO: Examples compilation does not define GRAPHICS, is it required? - #ifeq ($(GRAPHICS),GRAPHICS_API_OPENGL_ES2) - # LDLIBS += -lGLESv2 -lEGL - #endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_WIN32) - # Libraries for Windows desktop compilation - LDFLAGS += -L..\src - LDLIBS = -lraylib -lgdi32 -lwinmm -lshcore - ifneq ($(GRAPHICS),GRAPHICS_API_OPENGL_11_SOFTWARE) - LDLIBS += -lopengl32 - endif -endif -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - # Libraries for web (HTML5) compiling - LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.web.a -endif - -CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST)) - -# Define source code object files required -#------------------------------------------------------------------------------------------------ -#EXAMPLES_LIST_START -CORE = \ - core/core_2d_camera \ - core/core_2d_camera_mouse_zoom \ - core/core_2d_camera_platformer \ - core/core_2d_camera_split_screen \ - core/core_3d_camera_first_person \ - core/core_3d_camera_fps \ - core/core_3d_camera_free \ - core/core_3d_camera_mode \ - core/core_3d_camera_split_screen \ - core/core_3d_picking \ - core/core_automation_events \ - core/core_basic_screen_manager \ - core/core_basic_window \ - core/core_clipboard_text \ - core/core_compute_hash \ - core/core_custom_frame_control \ - core/core_custom_logging \ - core/core_delta_time \ - core/core_directory_files \ - core/core_drop_files \ - core/core_highdpi_demo \ - core/core_highdpi_testbed \ - core/core_input_actions \ - core/core_input_gamepad \ - core/core_input_gestures \ - core/core_input_gestures_testbed \ - core/core_input_keys \ - core/core_input_mouse \ - core/core_input_mouse_wheel \ - core/core_input_multitouch \ - core/core_input_virtual_controls \ - core/core_keyboard_testbed \ - core/core_monitor_detector \ - core/core_random_sequence \ - core/core_random_values \ - core/core_render_texture \ - core/core_scissor_test \ - core/core_screen_recording \ - core/core_smooth_pixelperfect \ - core/core_storage_values \ - core/core_text_file_loading \ - core/core_undo_redo \ - core/core_viewport_scaling \ - core/core_vr_simulator \ - core/core_window_flags \ - core/core_window_letterbox \ - core/core_window_should_close \ - core/core_world_screen - -SHAPES = \ - shapes/shapes_ball_physics \ - shapes/shapes_basic_shapes \ - shapes/shapes_bouncing_ball \ - shapes/shapes_bullet_hell \ - shapes/shapes_circle_sector_drawing \ - shapes/shapes_clock_of_clocks \ - shapes/shapes_collision_area \ - shapes/shapes_colors_palette \ - shapes/shapes_dashed_line \ - shapes/shapes_digital_clock \ - shapes/shapes_double_pendulum \ - shapes/shapes_easings_ball \ - shapes/shapes_easings_box \ - shapes/shapes_easings_rectangles \ - shapes/shapes_following_eyes \ - shapes/shapes_hilbert_curve \ - shapes/shapes_kaleidoscope \ - shapes/shapes_lines_bezier \ - shapes/shapes_lines_drawing \ - shapes/shapes_logo_raylib \ - shapes/shapes_logo_raylib_anim \ - shapes/shapes_math_angle_rotation \ - shapes/shapes_math_sine_cosine \ - shapes/shapes_mouse_trail \ - shapes/shapes_penrose_tile \ - shapes/shapes_pie_chart \ - shapes/shapes_rectangle_advanced \ - shapes/shapes_rectangle_scaling \ - shapes/shapes_recursive_tree \ - shapes/shapes_ring_drawing \ - shapes/shapes_rlgl_color_wheel \ - shapes/shapes_rlgl_triangle \ - shapes/shapes_rounded_rectangle_drawing \ - shapes/shapes_simple_particles \ - shapes/shapes_splines_drawing \ - shapes/shapes_starfield_effect \ - shapes/shapes_top_down_lights \ - shapes/shapes_triangle_strip \ - shapes/shapes_vector_angle - -TEXTURES = \ - textures/textures_background_scrolling \ - textures/textures_blend_modes \ - textures/textures_bunnymark \ - textures/textures_cellular_automata \ - textures/textures_fog_of_war \ - textures/textures_framebuffer_rendering \ - textures/textures_gif_player \ - textures/textures_image_channel \ - textures/textures_image_drawing \ - textures/textures_image_generation \ - textures/textures_image_kernel \ - textures/textures_image_loading \ - textures/textures_image_processing \ - textures/textures_image_rotate \ - textures/textures_image_text \ - textures/textures_logo_raylib \ - textures/textures_mouse_painting \ - textures/textures_npatch_drawing \ - textures/textures_particles_blending \ - textures/textures_polygon_drawing \ - textures/textures_raw_data \ - textures/textures_screen_buffer \ - textures/textures_sprite_animation \ - textures/textures_sprite_button \ - textures/textures_sprite_explosion \ - textures/textures_sprite_stacking \ - textures/textures_srcrec_dstrec \ - textures/textures_textured_curve \ - textures/textures_tiled_drawing \ - textures/textures_to_image - -TEXT = \ - text/text_3d_drawing \ - text/text_codepoints_loading \ - text/text_font_filters \ - text/text_font_loading \ - text/text_font_sdf \ - text/text_font_spritefont \ - text/text_format_text \ - text/text_inline_styling \ - text/text_input_box \ - text/text_rectangle_bounds \ - text/text_sprite_fonts \ - text/text_strings_management \ - text/text_unicode_emojis \ - text/text_unicode_ranges \ - text/text_words_alignment \ - text/text_writing_anim - -MODELS = \ - models/models_animation_gpu_skinning \ - models/models_animation_playing \ - models/models_basic_voxel \ - models/models_billboard_rendering \ - models/models_bone_socket \ - models/models_box_collisions \ - models/models_cubicmap_rendering \ - models/models_decals \ - models/models_directional_billboard \ - models/models_first_person_maze \ - models/models_geometric_shapes \ - models/models_heightmap_rendering \ - models/models_loading \ - 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_point_rendering \ - models/models_rlgl_solar_system \ - models/models_rotating_cube \ - models/models_skybox_rendering \ - models/models_tesseract_view \ - models/models_textured_cube \ - models/models_waving_cubes \ - models/models_yaw_pitch_roll - -SHADERS = \ - shaders/shaders_ascii_rendering \ - shaders/shaders_basic_lighting \ - shaders/shaders_basic_pbr \ - shaders/shaders_color_correction \ - shaders/shaders_custom_uniform \ - shaders/shaders_deferred_rendering \ - shaders/shaders_depth_rendering \ - shaders/shaders_depth_writing \ - shaders/shaders_eratosthenes_sieve \ - shaders/shaders_fog_rendering \ - shaders/shaders_game_of_life \ - shaders/shaders_hot_reloading \ - shaders/shaders_hybrid_rendering \ - shaders/shaders_julia_set \ - shaders/shaders_lightmap_rendering \ - shaders/shaders_mandelbrot_set \ - shaders/shaders_mesh_instancing \ - shaders/shaders_model_shader \ - shaders/shaders_multi_sample2d \ - shaders/shaders_normalmap_rendering \ - shaders/shaders_palette_switch \ - shaders/shaders_postprocessing \ - shaders/shaders_raymarching_rendering \ - shaders/shaders_rounded_rectangle \ - shaders/shaders_shadowmap_rendering \ - shaders/shaders_shapes_textures \ - shaders/shaders_simple_mask \ - shaders/shaders_spotlight_rendering \ - shaders/shaders_texture_outline \ - shaders/shaders_texture_rendering \ - shaders/shaders_texture_tiling \ - shaders/shaders_texture_waves \ - shaders/shaders_vertex_displacement - -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_sound_positioning \ - audio/audio_spectrum_visualizer \ - audio/audio_stream_effects - -OTHERS = \ - others/easings_testbed \ - others/embedded_files_loading \ - others/raylib_opengl_interop \ - others/rlgl_compute_shader \ - others/rlgl_standalone \ - others/web_basic_window -#EXAMPLES_LIST_END - -# Define processes to execute -#------------------------------------------------------------------------------------------------ -# Default target entry -all: $(CORE) $(SHAPES) $(TEXT) $(TEXTURES) $(MODELS) $(SHADERS) $(AUDIO) - -core: $(CORE) -shapes: $(SHAPES) -textures: $(TEXTURES) -text: $(TEXT) -models: $(MODELS) -shaders: $(SHADERS) -audio: $(AUDIO) - -# Generic compilation pattern -# NOTE: Examples must be ready for Android compilation! -%: %.c -ifeq ($(TARGET_PLATFORM),PLATFORM_ANDROID) - $(MAKE) -f Makefile.Android PROJECT_NAME=$@ PROJECT_SOURCE_FILES=$< -else ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - $(MAKE) -f Makefile.Web $@ -else - $(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) -D$(TARGET_PLATFORM) -endif - -# Clean everything -clean: -ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW) - ifeq ($(PLATFORM_OS),WINDOWS) - del *.o *.exe /s - endif - ifeq ($(PLATFORM_OS),BSD) - find . -type f -perm -ugo+x -delete - rm -fv *.o - endif - ifeq ($(PLATFORM_OS),LINUX) - find . -type f -executable -delete - rm -fv *.o - endif - ifeq ($(PLATFORM_OS),OSX) - find . -type f -perm +ugo+x -delete - rm -f *.o - endif -endif -ifeq ($(TARGET_PLATFORM),PLATFORM_DRM) - find . -type f -executable -delete - rm -fv *.o -endif -ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW)) - ifeq ($(PLATFORM_OS),WINDOWS) - del *.wasm *.html *.js *.data - else - rm -f */*.wasm */*.html */*.js */*.data - endif -endif - @echo Cleaning done diff --git a/src/raudio.c b/src/raudio.c index 2e087205e..54f8bdf3d 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -338,7 +338,11 @@ typedef enum { struct rAudioBuffer { ma_data_converter converter; // Audio data converter - AudioCallback callback; // Audio buffer callback for buffer filling on audio threads + // NOTE: Only one of these may be set at a time. + AudioCallback callback; // Audio buffer callback for buffer filling on audio threads + AudioCallbackEx callback_ex; // Same as callback, but with context pointer + void *callback_ex_ctx; // Context pointer passed to SetAudioStreamCallbackEx + rAudioProcessor *processor; // Audio processor float volume; // Audio buffer volume @@ -364,7 +368,12 @@ struct rAudioBuffer { // Audio processor struct // NOTE: Useful to apply effects to an AudioBuffer struct rAudioProcessor { + + // NOTE: Just like rAudioBuffer, only one of these process properties may be set at a time. AudioCallback process; // Processor callback function + AudioCallbackEx process_ex; // Processor callback function (with context pointer) + void *process_ex_ctx; // Context pointer to + rAudioProcessor *next; // Next audio processor on the list rAudioProcessor *prev; // Previous audio processor on the list }; @@ -592,6 +601,8 @@ AudioBuffer *LoadAudioBuffer(ma_format format, ma_uint32 channels, ma_uint32 sam audioBuffer->pan = 0.0f; // Center audioBuffer->callback = NULL; + audioBuffer->callback_ex = NULL; + audioBuffer->callback_ex_ctx = NULL; audioBuffer->processor = NULL; audioBuffer->playing = false; @@ -2229,6 +2240,19 @@ void SetAudioStreamBufferSizeDefault(int size) AUDIO.Buffer.defaultSize = size; } +// Audio thread callback to request new data (with context) +void SetAudioStreamCallbackEx(AudioStream stream, AudioCallbackEx callback, void *context) +{ + if (stream.buffer != NULL) + { + ma_mutex_lock(&AUDIO.System.lock); + stream.buffer->callback = NULL; + stream.buffer->callback_ex = callback; + stream.buffer->callback_ex_ctx = context; + ma_mutex_unlock(&AUDIO.System.lock); + } +} + // Audio thread callback to request new data void SetAudioStreamCallback(AudioStream stream, AudioCallback callback) { @@ -2236,10 +2260,60 @@ void SetAudioStreamCallback(AudioStream stream, AudioCallback callback) { ma_mutex_lock(&AUDIO.System.lock); stream.buffer->callback = callback; + stream.buffer->callback_ex = NULL; ma_mutex_unlock(&AUDIO.System.lock); } } +// Appends a given processor to the end of a linked list +// (list is double pointer such that we can manipulate the pointer itself) +void AppendAudioProcessorToLinkedList(rAudioProcessor **list, rAudioProcessor *processor) +{ + // if head is NULL to begin with, set it to processor. + if (*list) { + rAudioProcessor *node = (*list); + while (node->next) { + node = node->next; + } + + // node is the tail of the list now + processor->prev = node; + node->next = processor; + } else { + *list = processor; + } +} + +// Technically doesn't need a pointer to pointer, but uses one +// for parity with AppendAudioProcessorToLinkedList +void RemoveAudioProcessorFromLinkedList(rAudioProcessor **list, AudioCallback callback) +{ + rAudioProcessor *node = *list; + while (node) { + if (node->process == callback) { + if (node->prev) node->prev->next = node->next; + if (node->next) node->next->prev = node->prev; + RL_FREE(node); + break; + } + node = node->next; + } +} + +void RemoveAudioProcessorExFromLinkedList(rAudioProcessor **list, AudioCallbackEx callback, void *context) +{ + rAudioProcessor *node = *list; + while (node) { + if (node->process_ex == callback && node->process_ex_ctx == context) { + if (node->prev) node->prev->next = node->next; + if (node->next) node->next->prev = node->prev; + RL_FREE(node); + break; + } + node = node->next; + } +} + // Add processor to audio stream. Contrary to buffers, the order of processors is important // The new processor must be added at the end. As there aren't supposed to be a lot of processors attached to // a given stream, we iterate through the list to find the end. That way we don't need a pointer to the last element @@ -2250,18 +2324,20 @@ void AttachAudioStreamProcessor(AudioStream stream, AudioCallback process) rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); processor->process = process; - rAudioProcessor *last = stream.buffer->processor; + AppendAudioProcessorToLinkedList(&stream.buffer->processor, processor); - while (last && last->next) - { - last = last->next; - } - if (last) - { - processor->prev = last; - last->next = processor; - } - else stream.buffer->processor = processor; + ma_mutex_unlock(&AUDIO.System.lock); +} + +void AttachAudioStreamProcessorEx(AudioStream stream, AudioCallbackEx process, void *context) +{ + ma_mutex_lock(&AUDIO.System.lock); + + rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); + processor->process_ex = process; + processor->process_ex_ctx = context; + + AppendAudioProcessorToLinkedList(&stream.buffer->processor, processor); ma_mutex_unlock(&AUDIO.System.lock); } @@ -2271,24 +2347,17 @@ void DetachAudioStreamProcessor(AudioStream stream, AudioCallback process) { ma_mutex_lock(&AUDIO.System.lock); - rAudioProcessor *processor = stream.buffer->processor; + RemoveAudioProcessorFromLinkedList(&stream.buffer->processor, process); - while (processor) - { - rAudioProcessor *next = processor->next; - rAudioProcessor *prev = processor->prev; + ma_mutex_unlock(&AUDIO.System.lock); +} - if (processor->process == process) - { - if (stream.buffer->processor == processor) stream.buffer->processor = next; - if (prev) prev->next = next; - if (next) next->prev = prev; +// Remove processor from audio stream +void DetachAudioStreamProcessorEx(AudioStream stream, AudioCallbackEx process, void *context) +{ + ma_mutex_lock(&AUDIO.System.lock); - RL_FREE(processor); - } - - processor = next; - } + RemoveAudioProcessorExFromLinkedList(&stream.buffer->processor, process, context); ma_mutex_unlock(&AUDIO.System.lock); } @@ -2303,45 +2372,41 @@ void AttachAudioMixedProcessor(AudioCallback process) rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); processor->process = process; - rAudioProcessor *last = AUDIO.mixedProcessor; - - while (last && last->next) - { - last = last->next; - } - if (last) - { - processor->prev = last; - last->next = processor; - } - else AUDIO.mixedProcessor = processor; + AppendAudioProcessorToLinkedList(&AUDIO.mixedProcessor, processor); ma_mutex_unlock(&AUDIO.System.lock); } +void AttachAudioMixedProcessorEx(AudioCallbackEx process, void *context) +{ + ma_mutex_lock(&AUDIO.System.lock); + + rAudioProcessor *processor = (rAudioProcessor *)RL_CALLOC(1, sizeof(rAudioProcessor)); + processor->process_ex = process; + processor->process_ex_ctx = context; + + AppendAudioProcessorToLinkedList(&AUDIO.mixedProcessor, processor); + + ma_mutex_unlock(&AUDIO.System.lock); +} + + // Remove processor from audio pipeline void DetachAudioMixedProcessor(AudioCallback process) { ma_mutex_lock(&AUDIO.System.lock); - rAudioProcessor *processor = AUDIO.mixedProcessor; + RemoveAudioProcessorFromLinkedList(&AUDIO.mixedProcessor, process); - while (processor) - { - rAudioProcessor *next = processor->next; - rAudioProcessor *prev = processor->prev; + ma_mutex_unlock(&AUDIO.System.lock); +} - if (processor->process == process) - { - if (AUDIO.mixedProcessor == processor) AUDIO.mixedProcessor = next; - if (prev) prev->next = next; - if (next) next->prev = prev; +// Remove processor with context from audio pipeline +void DetachAudioMixedProcessorEx(AudioCallbackEx process, void *context) +{ + ma_mutex_lock(&AUDIO.System.lock); - RL_FREE(processor); - } - - processor = next; - } + RemoveAudioProcessorExFromLinkedList(&AUDIO.mixedProcessor, process, context); ma_mutex_unlock(&AUDIO.System.lock); } @@ -2359,11 +2424,14 @@ static void OnLog(void *pUserData, ma_uint32 level, const char *pMessage) static ma_uint32 ReadAudioBufferFramesInInternalFormat(AudioBuffer *audioBuffer, void *framesOut, ma_uint32 frameCount) { // Using audio buffer callback - if (audioBuffer->callback) - { - audioBuffer->callback(framesOut, frameCount); + if (audioBuffer->callback || audioBuffer->callback_ex) { + if (audioBuffer->callback) { + audioBuffer->callback(framesOut, frameCount); + } else if (audioBuffer->callback_ex) { + audioBuffer->callback_ex(framesOut, frameCount, audioBuffer->callback_ex_ctx); + } + audioBuffer->framesProcessed += frameCount; - return frameCount; } @@ -2539,9 +2607,12 @@ static void OnSendAudioDataToDevice(ma_device *pDevice, void *pFramesOut, const // Apply processors chain if defined rAudioProcessor *processor = audioBuffer->processor; - while (processor) - { - processor->process(framesIn, framesJustRead); + while (processor) { + if (processor->process) { + processor->process(framesIn, framesJustRead); + } else if (processor->process_ex) { + processor->process_ex(framesIn, framesJustRead, processor->process_ex_ctx); + } processor = processor->next; } @@ -2583,9 +2654,13 @@ static void OnSendAudioDataToDevice(ma_device *pDevice, void *pFramesOut, const } rAudioProcessor *processor = AUDIO.mixedProcessor; - while (processor) - { - processor->process(pFramesOut, frameCount); + while (processor) { + if (processor->process) { + processor->process(pFramesOut, frameCount); + } else if (processor->process_ex) { + processor->process_ex(pFramesOut, frameCount, processor->process_ex_ctx); + } + processor = processor->next; } diff --git a/src/raylib.h b/src/raylib.h index 8a0a14dad..f580320e1 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -462,8 +462,6 @@ typedef struct rAudioProcessor rAudioProcessor; // AudioStream, custom audio stream typedef struct AudioStream { rAudioBuffer *buffer; // Pointer to internal data used by the audio system - rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects - unsigned int sampleRate; // Frequency (samples per second) unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) @@ -1640,6 +1638,7 @@ RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 // Audio Loading and Playing Functions (Module: audio) //------------------------------------------------------------------------------------ typedef void (*AudioCallback)(void *bufferData, unsigned int frames); +typedef void (*AudioCallbackEx)(void *bufferData, unsigned int frames, void *context); // Audio device management functions RLAPI void InitAudioDevice(void); // Initialize audio device and context @@ -1712,12 +1711,17 @@ RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pit RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data +RLAPI void SetAudioStreamCallbackEx(AudioStream stream, AudioCallbackEx callback, void *context); // Audio thread callback to request new data (with context pointer) RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream, receives frames x 2 samples as 'float' (stereo) RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream +RLAPI void AttachAudioStreamProcessorEx(AudioStream stream, AudioCallbackEx processor, void *context); // Attach audio stream processor to stream, receives frames x 2 samples as 'float' (stereo) (with context pointer) +RLAPI void DetachAudioStreamProcessorEx(AudioStream stream, AudioCallbackEx processor, void *context); // Detach audio stream processor from stream (with context pointer) RLAPI void AttachAudioMixedProcessor(AudioCallback processor); // Attach audio stream processor to the entire audio pipeline, receives frames x 2 samples as 'float' (stereo) RLAPI void DetachAudioMixedProcessor(AudioCallback processor); // Detach audio stream processor from the entire audio pipeline +RLAPI void AttachAudioMixedProcessorEx(AudioCallbackEx processor, void *context); // Attach audio stream processor to the entire audio pipeline, receives frames x 2 samples as 'float' (stereo) (with context pointer) +RLAPI void DetachAudioMixedProcessorEx(AudioCallbackEx processor, void *context); // Detach audio stream processor from the entire audio pipeline (with context pointer) #if defined(__cplusplus) }