diff options
Diffstat (limited to 'src/rtextures.c')
| -rw-r--r-- | src/rtextures.c | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/src/rtextures.c b/src/rtextures.c index 24fbafd2..d602081b 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -70,12 +70,12 @@ #if defined(SUPPORT_MODULE_RTEXTURES) -#include "utils.h" // Required for: TRACELOG() and fopen() Android mapping +#include "utils.h" // Required for: TRACELOG() #include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 3.3 or ES2 #include <stdlib.h> // Required for: malloc(), free() #include <string.h> // Required for: strlen() [Used in ImageTextEx()], strcmp() [Used in LoadImageFromMemory()] -#include <math.h> // Required for: fabsf() +#include <math.h> // Required for: fabsf() [Used in DrawTextureRec()] #include <stdio.h> // Required for: sprintf() [Used in ExportImageAsCode()] // Support only desired texture formats on stb_image @@ -147,6 +147,11 @@ #include "external/stb_image_write.h" // Required for: stbi_write_*() #endif +#if defined(SUPPORT_IMAGE_GENERATION) + #define STB_PERLIN_IMPLEMENTATION + #include "external/stb_perlin.h" // Required for: stb_perlin_fbm_noise3 +#endif + #if defined(SUPPORT_IMAGE_MANIPULATION) #define STBIR_MALLOC(size,c) ((void)(c), RL_MALLOC(size)) #define STBIR_FREE(ptr,c) ((void)(c), RL_FREE(ptr)) @@ -760,6 +765,42 @@ Image GenImageWhiteNoise(int width, int height, float factor) return image; } +// Generate image: perlin noise +Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale) +{ + Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color)); + + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + float nx = (float)(x + offsetX)*scale/(float)width; + float ny = (float)(y + offsetY)*scale/(float)height; + + // Typical values to start playing with: + // lacunarity = ~2.0 -- spacing between successive octaves (use exactly 2.0 for wrapping output) + // gain = 0.5 -- relative weighting applied to each successive octave + // octaves = 6 -- number of "octaves" of noise3() to sum + + // NOTE: We need to translate the data from [-1..1] to [0..1] + float p = (stb_perlin_fbm_noise3(nx, ny, 1.0f, 2.0f, 0.5f, 6) + 1.0f)/2.0f; + + int intensity = (int)(p*255.0f); + pixels[y*width + x] = (Color){ intensity, intensity, intensity, 255 }; + } + } + + Image image = { + .data = pixels, + .width = width, + .height = height, + .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, + .mipmaps = 1 + }; + + return image; +} + // Generate image: cellular algorithm. Bigger tileSize means bigger cells Image GenImageCellular(int width, int height, int tileSize) { @@ -3181,19 +3222,19 @@ void SetTextureWrap(Texture2D texture, int wrap) //------------------------------------------------------------------------------------ // Texture drawing functions //------------------------------------------------------------------------------------ -// Draw a Texture2D +// Draw a texture void DrawTexture(Texture2D texture, int posX, int posY, Color tint) { DrawTextureEx(texture, (Vector2){ (float)posX, (float)posY }, 0.0f, 1.0f, tint); } -// Draw a Texture2D with position defined as Vector2 +// Draw a texture with position defined as Vector2 void DrawTextureV(Texture2D texture, Vector2 position, Color tint) { DrawTextureEx(texture, position, 0, 1.0f, tint); } -// Draw a Texture2D with extended parameters +// Draw a texture with extended parameters void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint) { Rectangle source = { 0.0f, 0.0f, (float)texture.width, (float)texture.height }; |
