summaryrefslogtreecommitdiffhomepage
path: root/src/rtextures.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rtextures.c')
-rw-r--r--src/rtextures.c51
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 };