Add GenImageGradientSquare to allow square gradients

This commit is contained in:
Dane Madsen 2023-05-22 12:00:41 +10:00
parent 84ae26cdc0
commit 534adbe7ce
6 changed files with 72 additions and 0 deletions

View File

@ -1563,6 +1563,15 @@
<Param type="Color" name="inner" desc="" />
<Param type="Color" name="outer" desc="" />
</Function>
<Function name="GenImageGradientSquare" retType="Image" paramCount="7" desc="Generate image: square gradient">
<Param type="int" name="width" desc="" />
<Param type="int" name="height" desc="" />
<Param type="int" name="int gradiantWidth" desc="" />
<Param type="int" name="int gradientHeight" desc="" />
<Param type="float" name="density" desc="" />
<Param type="Color" name="inner" desc="" />
<Param type="Color" name="outer" desc="" />
</Function>
<Function name="GenImageChecked" retType="Image" paramCount="6" desc="Generate image: checked">
<Param type="int" name="width" desc="" />
<Param type="int" name="height" desc="" />

View File

@ -213,6 +213,7 @@ ImageColorReplace|void|(Image *image, Color color, Color replace);|
GenImageColor|Image|(int width, int height, Color color);|
GenImageGradientLinear|Image|(int width, int height, int direction, Color start, Color end);|
GenImageGradientRadial|Image|(int width, int height, float density, Color inner, Color outer);|
GenImageGradientSquare|Image|(int width, int height, int gradientWidth, int gradientHeight, float density, Color inner, Color outer);|
GenImageChecked|Image|(int width, int height, int checksX, int checksY, Color col1, Color col2);|
GenImageWhiteNoise|Image|(int width, int height, float factor);|
GenImagePerlinNoise|Image|(int width, int height, int offsetX, int offsetY, float scale);|

View File

@ -1396,6 +1396,17 @@
<Param name="Color outer" />
</Overload>
</KeyWord>
<KeyWord name="GenImageGradientSquare" func="yes">
<Overload retVal="Image" descr="Generate image: square gradient">
<Param name="int width" />
<Param name="int height" />
<Param name="int gradiantWidth" />
<Param name="int gradientHeight" />
<Param name="float density" />
<Param name="Color inner" />
<Param name="Color outer" />
</Overload>
</KeyWord>
<KeyWord name="GenImageChecked" func="yes">
<Overload retVal="Image" descr="Generate image: checked">
<Param name="int width" />

View File

@ -319,6 +319,7 @@ RLAPI bool ExportImageAsCode(Image image, const char *fileName);
RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color
RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient
RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient
RLAPI Image GenImageGradientSquare(int width, int height, int gradientWidth, int gradientHeight, float density, Color inner, Color outer); // Generate image: square gradient
RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked
RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise
RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise

View File

@ -1241,6 +1241,7 @@ RLAPI bool ExportImageAsCode(Image image, const char *fileName);
RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color
RLAPI Image GenImageGradientLinear(int width, int height, int direction, Color start, Color end); // Generate image: linear gradient, direction in degrees [0..360], 0=Vertical gradient
RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient
RLAPI Image GenImageGradientSquare(int width, int height, int gradientWidth, int gradientHeight, float density, Color inner, Color outer); // Generate image: square gradient
RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked
RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise
RLAPI Image GenImagePerlinNoise(int width, int height, int offsetX, int offsetY, float scale); // Generate image: perlin noise

View File

@ -764,6 +764,55 @@ Image GenImageGradientRadial(int width, int height, float density, Color inner,
return image;
}
// Generate image: square gradient
Image GenImageGradientSquare(int width, int weight, int gradientWidth, int gradientHeight, float density, Color inner, Color outer)
{
Color *pixels = (Color *)RL_MALLOC(width*height*sizeof(Color));
float centerX = (float)width/2.0f;
float centerY = (float)height/2.0f;
float gradientCenterX = gradientWidth / 2.0f;
float gradientCenterY = gradientHeight / 2.0f;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
// Calculate the Manhattan distance from the center
float distX = fabsf(x - centerX);
float distY = fabsf(y - centerY);
// Normalize the distances by the dimensions of the gradient rectangle
float normalizedDistX = distX / gradientCenterX;
float normalizedDistY = distY / gradientCenterY;
// Calculate the total normalized Manhattan distance
float manhattanDist = fmax(normalizedDistX, normalizedDistY) * density;
// Clamp the factor between 0 and 1
float factor = fminf(fmaxf(manhattanDist, 0.f), 1.f);
// Blend the colors based on the calculated factor
pixels[y*width + x].r = (int)((float)outer.r*factor + (float)inner.r*(1.0f - factor));
pixels[y*width + x].g = (int)((float)outer.g*factor + (float)inner.g*(1.0f - factor));
pixels[y*width + x].b = (int)((float)outer.b*factor + (float)inner.b*(1.0f - factor));
pixels[y*width + x].a = (int)((float)outer.a*factor + (float)inner.a*(1.0f - factor));
}
}
Image image = {
.data = pixels,
.width = width,
.height = height,
.format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,
.mipmaps = 1
};
return image;
}
// Generate image: checked
Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2)
{