From 95da97fa744766fb46b912dcae504cd858fd2377 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Mon, 4 Jan 2016 15:09:44 +0100 Subject: [PATCH 1/2] Fixed bug: rlglGenerateMipmaps() --- src/rlgl.c | 33 ++++++++++++--------------------- src/rlgl.h | 2 +- src/textures.c | 4 ++-- 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/rlgl.c b/src/rlgl.c index 8a0440e04..504381b2a 100644 --- a/src/rlgl.c +++ b/src/rlgl.c @@ -1921,40 +1921,31 @@ void rlglUpdateTexture(unsigned int id, int width, int height, int format, void } // Generate mipmap data for selected texture -void rlglGenerateMipmaps(unsigned int textureId) +void rlglGenerateMipmaps(Texture2D texture) { - glBindTexture(GL_TEXTURE_2D, textureId); + glBindTexture(GL_TEXTURE_2D, texture.id); // Check if texture is power-of-two (POT) bool texIsPOT = false; - // NOTE: In OpenGL ES 2.0 we have no way to retrieve texture size from id - -#if defined(GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) - int width, height; - - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); - glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height); - - if (((width > 0) && ((width & (width - 1)) == 0)) && ((height > 0) && ((height & (height - 1)) == 0))) texIsPOT = true; -#endif + if (((texture.width > 0) && ((texture.width & (texture.width - 1)) == 0)) && + ((texture.height > 0) && ((texture.height & (texture.height - 1)) == 0))) texIsPOT = true; if ((texIsPOT) || (npotSupported)) { #if defined(GRAPHICS_API_OPENGL_11) // Compute required mipmaps - // TODO: rlglReadTexturePixels() needs Texture2D type parameter, not unsigned int parameter - void *data; // = rlglReadTexturePixels(textureId, UNCOMPRESSED_R8G8B8A8); // TODO: Detect internal format + void *data = rlglReadTexturePixels(texture); // NOTE: data size is reallocated to fit mipmaps data - int mipmapCount = GenerateMipmaps(data, width, height); + int mipmapCount = GenerateMipmaps(data, texture.width, texture.height); // TODO: Adjust mipmap size depending on texture format! - int size = width*height*4; + int size = texture.width*texture.height*4; int offset = size; - int mipWidth = width/2; - int mipHeight = height/2; + int mipWidth = texture.width/2; + int mipHeight = texture.height/2; // Load the mipmaps for (int level = 1; level < mipmapCount; level++) @@ -1968,17 +1959,17 @@ void rlglGenerateMipmaps(unsigned int textureId) mipHeight /= 2; } - TraceLog(WARNING, "[TEX ID %i] Mipmaps generated manually on CPU side", textureId); + TraceLog(WARNING, "[TEX ID %i] Mipmaps generated manually on CPU side", texture.id); #elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) glGenerateMipmap(GL_TEXTURE_2D); // Generate mipmaps automatically - TraceLog(INFO, "[TEX ID %i] Mipmaps generated automatically", textureId); + TraceLog(INFO, "[TEX ID %i] Mipmaps generated automatically", texture.id); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Activate Trilinear filtering for mipmaps (must be available) #endif } - else TraceLog(WARNING, "[TEX ID %i] Mipmaps can not be generated", textureId); + else TraceLog(WARNING, "[TEX ID %i] Mipmaps can not be generated", texture.id); glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/src/rlgl.h b/src/rlgl.h index a7df043ed..93b56bb2c 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -246,7 +246,7 @@ void rlglInitGraphics(int offsetX, int offsetY, int width, int height); // Init unsigned int rlglLoadTexture(void *data, int width, int height, int textureFormat, int mipmapCount); // Load texture in GPU void rlglUpdateTexture(unsigned int id, int width, int height, int format, void *data); // Update GPU texture with new data -void rlglGenerateMipmaps(unsigned int textureId); // Generate mipmap data for selected texture +void rlglGenerateMipmaps(Texture2D texture); // Generate mipmap data for selected texture // NOTE: There is a set of shader related functions that are available to end user, // to avoid creating function wrappers through core module, they have been directly declared in raylib.h diff --git a/src/textures.c b/src/textures.c index 30ffb9458..f03d2d9ad 100644 --- a/src/textures.c +++ b/src/textures.c @@ -1271,9 +1271,9 @@ void GenTextureMipmaps(Texture2D texture) { TraceLog(WARNING, "Limited NPOT support, no mipmaps available for NPOT textures"); } - else rlglGenerateMipmaps(texture.id); + else rlglGenerateMipmaps(texture); #else - rlglGenerateMipmaps(texture.id); + rlglGenerateMipmaps(texture); #endif } From 70d405b41bcbbd73b9f752f4dc3910100abd1a36 Mon Sep 17 00:00:00 2001 From: raysan5 Date: Mon, 4 Jan 2016 15:12:34 +0100 Subject: [PATCH 2/2] Added functionality: Storage values Two new functions added to save/load values as binary data: - StorageSaveValue() - StorageLoadValue() --- examples/core_storage_values.c | 85 +++++++++++++++++++++++++++++++ examples/core_storage_values.png | Bin 0 -> 16147 bytes src/core.c | 61 ++++++++++++++++++++++ src/raylib.h | 3 ++ 4 files changed, 149 insertions(+) create mode 100644 examples/core_storage_values.c create mode 100644 examples/core_storage_values.png diff --git a/examples/core_storage_values.c b/examples/core_storage_values.c new file mode 100644 index 000000000..3190d0a08 --- /dev/null +++ b/examples/core_storage_values.c @@ -0,0 +1,85 @@ +/******************************************************************************************* +* +* raylib [core] example - Storage save/load values +* +* This example has been created using raylib 1.4 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2014 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +// NOTE: Storage positions must start with 0, directly related to file memory layout +typedef enum { STORAGE_SCORE = 0, STORAGE_HISCORE } StorageData; + +int main() +{ + // Initialization + //-------------------------------------------------------------------------------------- + int screenWidth = 800; + int screenHeight = 450; + + InitWindow(screenWidth, screenHeight, "raylib [core] example - storage save/load values"); + + int score = 0; + int hiscore = 0; + + int framesCounter = 0; + + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update + //---------------------------------------------------------------------------------- + if (IsKeyPressed(KEY_R)) + { + score = GetRandomValue(1000, 2000); + hiscore = GetRandomValue(2000, 4000); + } + + if (IsKeyPressed(KEY_ENTER)) + { + StorageSaveValue(STORAGE_SCORE, score); + StorageSaveValue(STORAGE_HISCORE, hiscore); + } + else if (IsKeyPressed(KEY_SPACE)) + { + // NOTE: If requested position could not be found, value 0 is returned + score = StorageLoadValue(STORAGE_SCORE); + hiscore = StorageLoadValue(STORAGE_HISCORE); + } + + framesCounter++; + //---------------------------------------------------------------------------------- + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground(RAYWHITE); + + DrawText(FormatText("SCORE: %i", score), 280, 130, 40, MAROON); + DrawText(FormatText("HI-SCORE: %i", hiscore), 210, 200, 50, BLACK); + + DrawText(FormatText("frames: %i", framesCounter), 10, 10, 20, LIME); + + DrawText("Press R to generate random numbers", 220, 40, 20, LIGHTGRAY); + DrawText("Press ENTER to SAVE values", 250, 310, 20, LIGHTGRAY); + DrawText("Press SPACE to LOAD values", 252, 350, 20, LIGHTGRAY); + + EndDrawing(); + //---------------------------------------------------------------------------------- + } + + // De-Initialization + //-------------------------------------------------------------------------------------- + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} \ No newline at end of file diff --git a/examples/core_storage_values.png b/examples/core_storage_values.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfd552dd63f24c854877db10f4e77cc6e6b4367 GIT binary patch literal 16147 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