From f607cac267ae21e9b6392dc510f389b43c9e63f4 Mon Sep 17 00:00:00 2001 From: "Dennis E. Hamilton" Date: Sat, 18 Nov 2023 11:01:02 -0800 Subject: Preparing for 5.1-dev (#3550) Adjusting raylib.h to reflect post-5.0 changes now. --- src/raylib.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/raylib.h b/src/raylib.h index 1c4c4a09..6ea00300 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1,6 +1,6 @@ /********************************************************************************************** * -* raylib v5.0 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* raylib v5.1-dev - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) * * FEATURES: * - NO external dependencies, all required libraries included with raylib @@ -82,9 +82,9 @@ #include // Required for: va_list - Only used by TraceLogCallback #define RAYLIB_VERSION_MAJOR 5 -#define RAYLIB_VERSION_MINOR 0 +#define RAYLIB_VERSION_MINOR 1 #define RAYLIB_VERSION_PATCH 0 -#define RAYLIB_VERSION "5.0" +#define RAYLIB_VERSION "5.1-dev" // Function specifiers in case library is build/used as a shared library (Windows) // NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll -- cgit v1.2.3 From e41a0c9721a38c81a1499ae499b746bd05f9de2e Mon Sep 17 00:00:00 2001 From: _Tradam Date: Sat, 18 Nov 2023 14:03:13 -0500 Subject: fix for running gles2 with sdl on desktop (#3542) --- src/platforms/rcore_desktop_sdl.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src') diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index 96e55702..7836828f 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -49,7 +49,14 @@ **********************************************************************************************/ #include "SDL.h" // SDL base library (window/rendered, input, timming... functionality) +#ifdef GRAPHICS_API_OPENGL_ES2 +// I suspect that the gles2 version of the SDL header should be used +// but the compilation fails if we do. Not including anything appears +// to work fine. +//#include "SDL_opengles2.h" +#else #include "SDL_opengl.h" // SDL OpenGL functionality (if required, instead of internal renderer) +#endif //---------------------------------------------------------------------------------- // Types and Structures Definition -- cgit v1.2.3 From 21469e92b0a886de8b384b7ffadc5c1c73cff913 Mon Sep 17 00:00:00 2001 From: Karim <35817819+Kimo-s@users.noreply.github.com> Date: Sat, 18 Nov 2023 14:05:45 -0500 Subject: Image convolution function ImageKernelConvolution (#3528) * Added image convultion ImageKernelConvolution * comment changes * spelling changes and change to kernel size * removed kernel normalization inside function * fix to formating --- examples/Makefile | 1 + examples/textures/textures_image_kernel.c | 127 ++++++++++++++++++ .../Notepad++/raylib_npp_parser/raylib_to_parse.h | 1 + src/raylib.h | 1 + src/rtextures.c | 142 +++++++++++++++++++++ 5 files changed, 272 insertions(+) create mode 100644 examples/textures/textures_image_kernel.c (limited to 'src') diff --git a/examples/Makefile b/examples/Makefile index 5cd8e6bb..11669e3a 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -490,6 +490,7 @@ TEXTURES = \ textures/textures_gif_player \ textures/textures_image_drawing \ textures/textures_image_generation \ + textures/textures_image_kernel \ textures/textures_image_loading \ textures/textures_image_processing \ textures/textures_image_rotate \ diff --git a/examples/textures/textures_image_kernel.c b/examples/textures/textures_image_kernel.c new file mode 100644 index 00000000..cbc75e18 --- /dev/null +++ b/examples/textures/textures_image_kernel.c @@ -0,0 +1,127 @@ +/******************************************************************************************* +* +* raylib [textures] example - Image loading and texture creation +* +* NOTE: Images are loaded in CPU memory (RAM); textures are loaded in GPU memory (VRAM) +* +* Example originally created with raylib 1.3, last time updated with raylib 1.3 +* +* 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) 2015-2023 Karim Salem (@kimo-s) +* +********************************************************************************************/ + +#include "raylib.h" + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +void normalizeKernel(float *kernel, int size){ + float sum = 0.0f; + for(int i = 0; i < size; i++) + { + sum += kernel[i]; + } + + if(sum != 0.0f) + { + for(int i = 0; i < size; i++) + { + kernel[i] /= sum; + } + } +} + +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + + Image image = LoadImage("resources/cat.png"); // Loaded in CPU memory (RAM) + + const int screenWidth = 800; + const int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [textures] example - image convolution"); + + float gaussiankernel[] = {1.0, 2.0, 1.0, + 2.0, 4.0, 2.0, + 1.0, 2.0, 1.0}; + + float sobelkernel[] = {1.0, 0.0, -1.0, + 2.0, 0.0, -2.0, + 1.0, 0.0, -1.0}; + + float sharpenkernel[] = {0.0, -1.0, 0.0, + -1.0, 5.0, -1.0, + 0.0, -1.0, 0.0}; + + normalizeKernel(gaussiankernel, 9); + normalizeKernel(sharpenkernel, 9); + normalizeKernel(sobelkernel, 9); + + Image catSharpend = ImageCopy(image); + ImageKernelConvolution(&catSharpend, sharpenkernel, 9); + + Image catSobel = ImageCopy(image); + ImageKernelConvolution(&catSobel, sobelkernel, 9); + + Image catGaussian = ImageCopy(image); + for(int i = 0; i < 6; i++) + { + ImageKernelConvolution(&catGaussian, gaussiankernel, 9); + } + + ImageCrop(&image, (Rectangle){ 0, 0, (float)200, (float)450 }); + ImageCrop(&catGaussian, (Rectangle){ 0, 0, (float)200, (float)450 }); + ImageCrop(&catSobel, (Rectangle){ 0, 0, (float)200, (float)450 }); + ImageCrop(&catSharpend, (Rectangle){ 0, 0, (float)200, (float)450 }); + Texture2D texture = LoadTextureFromImage(image); // Image converted to texture, GPU memory (VRAM) + Texture2D catSharpendTexture = LoadTextureFromImage(catSharpend); + Texture2D catSobelTexture = LoadTextureFromImage(catSobel); + Texture2D catGaussianTexture = LoadTextureFromImage(catGaussian); + UnloadImage(image); // Once image has been converted to texture and uploaded to VRAM, it can be unloaded from RAM + UnloadImage(catGaussian); + UnloadImage(catSobel); + UnloadImage(catSharpend); + + 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 + //---------------------------------------------------------------------------------- + // TODO: Update your variables here + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawTexture(catSharpendTexture, 0, 0, WHITE); + DrawTexture(catSobelTexture, 200, 0, WHITE); + DrawTexture(catGaussianTexture, 400, 0, WHITE); + DrawTexture(texture, 600, 0, WHITE); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadTexture(texture); // Texture unloading + UnloadTexture(catGaussianTexture); + UnloadTexture(catSobelTexture); + UnloadTexture(catSharpendTexture); + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} diff --git a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h index 2c033c91..8776d434 100644 --- a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h +++ b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h @@ -375,6 +375,7 @@ RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, float* kernel, int kernelSize); // Apply Custom Square image convolution kernel RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color diff --git a/src/raylib.h b/src/raylib.h index 6ea00300..28f052c7 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1329,6 +1329,7 @@ RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel RLAPI void ImageBlurGaussian(Image *image, int blurSize); // Apply Gaussian blur using a box blur approximation +RLAPI void ImageKernelConvolution(Image *image, float* kernel, int kernelSize); // Apply Custom Square image convolution kernel RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color diff --git a/src/rtextures.c b/src/rtextures.c index 98586db7..8742b0c9 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -2082,6 +2082,148 @@ void ImageBlurGaussian(Image *image, int blurSize) { ImageFormat(image, format); } +// The kernel matrix is assumed to be square. Only supply the width of the kernel. +void ImageKernelConvolution(Image *image, float* kernel, int kernelSize){ + + if ((image->data == NULL) || (image->width == 0) || (image->height == 0) || kernel == NULL) return; + + int kernelWidth = (int)sqrtf((float)kernelSize); + if (kernelWidth*kernelWidth != kernelSize) + { + TRACELOG(LOG_WARNING, "IMAGE: Convolution kernel must be square to be applied"); + return; + } + + Color *pixels = LoadImageColors(*image); + + Vector4 *imageCopy2 = RL_MALLOC((image->height)*(image->width)*sizeof(Vector4)); + Vector4 *temp = RL_MALLOC(kernelSize*sizeof(Vector4)); + + + for(int i = 0; i < kernelSize; i++){ + temp[i].x = 0.0f; + temp[i].y = 0.0f; + temp[i].z = 0.0f; + temp[i].w = 0.0f; + } + + float rRes = 0.0f; + float gRes = 0.0f; + float bRes = 0.0f; + float aRes = 0.0f; + + + int startRange, endRange; + if(kernelWidth % 2 == 0) + { + startRange = -kernelWidth/2; + endRange = kernelWidth/2; + } else + { + startRange = -kernelWidth/2; + endRange = kernelWidth/2+1; + } + for(int x = 0; x < image->height; x++) + { + for(int y = 0; y < image->width; y++) + { + + for(int xk = startRange; xk < endRange; xk++) + { + for(int yk = startRange; yk < endRange; yk++) + { + int xkabs = xk + kernelWidth/2; + int ykabs = yk + kernelWidth/2; + size_t imgindex = image->width * (x+xk) + (y+yk); + if(imgindex < 0 || imgindex >= image->width * image->height){ + temp[kernelWidth * xkabs + ykabs].x = 0.0f; + temp[kernelWidth * xkabs + ykabs].y = 0.0f; + temp[kernelWidth * xkabs + ykabs].z = 0.0f; + temp[kernelWidth * xkabs + ykabs].w = 0.0f; + } else { + temp[kernelWidth * xkabs + ykabs].x = ((float)pixels[imgindex].r)/255.0f * kernel[kernelWidth * xkabs + ykabs]; + temp[kernelWidth * xkabs + ykabs].y = ((float)pixels[imgindex].g)/255.0f * kernel[kernelWidth * xkabs + ykabs]; + temp[kernelWidth * xkabs + ykabs].z = ((float)pixels[imgindex].b)/255.0f * kernel[kernelWidth * xkabs + ykabs]; + temp[kernelWidth * xkabs + ykabs].w = ((float)pixels[imgindex].a)/255.0f * kernel[kernelWidth * xkabs + ykabs]; + } + } + } + + for(int i = 0; i < kernelSize; i++) + { + rRes += temp[i].x; + gRes += temp[i].y; + bRes += temp[i].z; + aRes += temp[i].w; + } + + if(rRes < 0.0f) + { + rRes = 0.0f; + } + if(gRes < 0.0f) + { + gRes = 0.0f; + } + if(bRes < 0.0f) + { + bRes = 0.0f; + } + + if(rRes > 1.0f) + { + rRes = 1.0f; + } + if(gRes > 1.0f) + { + gRes = 1.0f; + } + if(bRes > 1.0f) + { + bRes = 1.0f; + } + + imageCopy2[image->width * (x) + (y)].x = rRes; + imageCopy2[image->width * (x) + (y)].y = gRes; + imageCopy2[image->width * (x) + (y)].z = bRes; + imageCopy2[image->width * (x) + (y)].w = aRes; + + rRes = 0.0f; + gRes = 0.0f; + bRes = 0.0f; + aRes = 0.0f; + + for(int i = 0; i < kernelSize; i++) + { + temp[i].x = 0.0f; + temp[i].y = 0.0f; + temp[i].z = 0.0f; + temp[i].w = 0.0f; + } + } + } + + for (int i = 0; i < (image->width) * (image->height); i++) + { + float alpha = (float)imageCopy2[i].w; + pixels[i].r = (unsigned char)((imageCopy2[i].x)*255.0f); + pixels[i].g = (unsigned char)((imageCopy2[i].y)*255.0f); + pixels[i].b = (unsigned char)((imageCopy2[i].z)*255.0f); + pixels[i].a = (unsigned char)((alpha)*255.0f); + // printf("pixels[%d] = %d", i, pixels[i].r); + } + + + int format = image->format; + RL_FREE(image->data); + RL_FREE(imageCopy2); + RL_FREE(temp); + + image->data = pixels; + image->format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8; + ImageFormat(image, format); +} + // Generate all mipmap levels for a provided image // NOTE 1: Supports POT and NPOT images // NOTE 2: image.data is scaled to include mipmap levels -- cgit v1.2.3 From f6de0358e137625e12f60b26c794cc05f09999e4 Mon Sep 17 00:00:00 2001 From: Alexandre Almeida Date: Sat, 18 Nov 2023 16:06:19 -0300 Subject: Disable unused miniaudio features (#3544) * Disable unused miniaudio features * Fix mistakes --- src/raudio.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/raudio.c b/src/raudio.c index e38e51e6..c321aa50 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -167,6 +167,10 @@ typedef struct tagBITMAPINFOHEADER { #define MA_NO_WAV #define MA_NO_FLAC #define MA_NO_MP3 +#define MA_NO_RESOURCE_MANAGER +#define MA_NO_NODE_GRAPH +#define MA_NO_ENGINE +#define MA_NO_GENERATION // Threading model: Default: [0] COINIT_MULTITHREADED: COM calls objects on any thread (free threading) #define MA_COINIT_VALUE 2 // [2] COINIT_APARTMENTTHREADED: Each object has its own thread (apartment model) -- cgit v1.2.3 From 0137efde7a20903ce50fbd8a796dc92c77cb2c39 Mon Sep 17 00:00:00 2001 From: MrScautHD <65916181+MrScautHD@users.noreply.github.com> Date: Sat, 18 Nov 2023 20:07:30 +0100 Subject: Expanding Possibilities: Integrating Additional glTF / GLB Data Formats for Enhanced 3D Experiences (#3546) * Add more gltf data formats * Fix forgot to save bone ids * Fix misstake * Fix code format * Removed useless formats --- src/rmodels.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/rmodels.c b/src/rmodels.c index 229d373f..c191f0ac 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -5155,16 +5155,29 @@ static Model LoadGLTF(const char *fileName) if ((attribute->component_type == cgltf_component_type_r_8u) && (attribute->type == cgltf_type_vec4)) { - // Init raylib mesh bone ids to copy glTF attribute data + // Handle 8-bit unsigned byte, vec4 format model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); - - // Load 4 components of unsigned char data type into mesh.boneIds - // for cgltf_attribute_type_joints we have: - // - data.meshes[0] (256 vertices) - // - 256 values, provided as cgltf_type_vec4 of bytes (4 byte per joint, stride 4) LOAD_ATTRIBUTE(attribute, 4, unsigned char, model.meshes[meshIndex].boneIds) } - else TRACELOG(LOG_WARNING, "MODEL: [%s] Joint attribute data format not supported, use vec4 u8", fileName); + else if ((attribute->component_type == cgltf_component_type_r_16u) && (attribute->type == cgltf_type_vec2)) + { + // Handle 16-bit unsigned short, vec2 format + model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount*2, sizeof(unsigned short)); + LOAD_ATTRIBUTE(attribute, 2, unsigned short, model.meshes[meshIndex].boneIds) + } + else if ((attribute->component_type == cgltf_component_type_r_32u) && (attribute->type == cgltf_type_vec4)) + { + // Handle 32-bit unsigned int, vec4 format + model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned int)); + LOAD_ATTRIBUTE(attribute, 4, unsigned int, model.meshes[meshIndex].boneIds) + } + else if ((attribute->component_type == cgltf_component_type_r_32f) && (attribute->type == cgltf_type_vec2)) + { + // Handle 32-bit float, vec2 format + model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount*2, sizeof(float)); + LOAD_ATTRIBUTE(attribute, 2, float, model.meshes[meshIndex].boneIds) + } + else TRACELOG(LOG_WARNING, "MODEL: [%s] Joint attribute data format not supported", fileName); } else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_weights) // WEIGHTS_n (vec4 / u8, u16, f32) { -- cgit v1.2.3 From 994c4f4bdf1f47f706447724b813c9304a66fb16 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 20 Nov 2023 23:21:04 +0100 Subject: Update rcore_desktop_sdl.c --- src/platforms/rcore_desktop_sdl.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/platforms/rcore_desktop_sdl.c b/src/platforms/rcore_desktop_sdl.c index 7836828f..0d3b091f 100644 --- a/src/platforms/rcore_desktop_sdl.c +++ b/src/platforms/rcore_desktop_sdl.c @@ -48,14 +48,13 @@ * **********************************************************************************************/ -#include "SDL.h" // SDL base library (window/rendered, input, timming... functionality) -#ifdef GRAPHICS_API_OPENGL_ES2 -// I suspect that the gles2 version of the SDL header should be used -// but the compilation fails if we do. Not including anything appears -// to work fine. -//#include "SDL_opengles2.h" +#include "SDL.h" // SDL base library (window/rendered, input, timming... functionality) + +#if defined(GRAPHICS_API_OPENGL_ES2) + // It seems it does not need to be included to work + //#include "SDL_opengles2.h" #else -#include "SDL_opengl.h" // SDL OpenGL functionality (if required, instead of internal renderer) + #include "SDL_opengl.h" // SDL OpenGL functionality (if required, instead of internal renderer) #endif //---------------------------------------------------------------------------------- -- cgit v1.2.3