aboutsummaryrefslogtreecommitdiff
path: root/raylib/examples/shaders/shaders_julia_set.c
diff options
context:
space:
mode:
authorUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
committerUneven Prankster <unevenprankster@protonmail.com>2023-11-16 21:12:27 -0300
commit2bbf92ad5ae7708bf18ac7ef333e9a979d8d1bde (patch)
treec9d22bb0d73d9cc0c8586e4d31c93a561ea8e910 /raylib/examples/shaders/shaders_julia_set.c
parent1c0cc775732201f4c4d3ee0d6772be786b3b4aa1 (diff)
Working so hard like a soldiermain
Can't afford a thing on TV
Diffstat (limited to 'raylib/examples/shaders/shaders_julia_set.c')
-rw-r--r--raylib/examples/shaders/shaders_julia_set.c96
1 files changed, 51 insertions, 45 deletions
diff --git a/raylib/examples/shaders/shaders_julia_set.c b/raylib/examples/shaders/shaders_julia_set.c
index aebb287..608d3b5 100644
--- a/raylib/examples/shaders/shaders_julia_set.c
+++ b/raylib/examples/shaders/shaders_julia_set.c
@@ -9,12 +9,12 @@
*
* Example originally created with raylib 2.5, last time updated with raylib 4.0
*
-* Example contributed by eggmund (@eggmund) and reviewed by Ramon Santamaria (@raysan5)
+* Example contributed by Josh Colclough (@joshcol9232) and reviewed by Ramon Santamaria (@raysan5)
*
* 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) 2019-2023 eggmund (@eggmund) and Ramon Santamaria (@raysan5)
+* Copyright (c) 2019-2023 Josh Colclough (@joshcol9232) and Ramon Santamaria (@raysan5)
*
********************************************************************************************/
@@ -37,6 +37,13 @@ const float pointsOfInterest[6][2] =
{ -0.70176f, -0.3842f },
};
+const int screenWidth = 800;
+const int screenHeight = 450;
+const float zoomSpeed = 1.01f;
+const float offsetSpeedMul = 2.0f;
+
+const float startingZoom = 0.75f;
+
//------------------------------------------------------------------------------------
// Program main entry point
//------------------------------------------------------------------------------------
@@ -44,10 +51,6 @@ int main(void)
{
// Initialization
//--------------------------------------------------------------------------------------
- const int screenWidth = 800;
- const int screenHeight = 450;
-
- //SetConfigFlags(FLAG_WINDOW_HIGHDPI);
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets");
// Load julia set shader
@@ -61,10 +64,8 @@ int main(void)
float c[2] = { pointsOfInterest[0][0], pointsOfInterest[0][1] };
// Offset and zoom to draw the julia set at. (centered on screen and default size)
- float offset[2] = { -(float)GetScreenWidth()/2, -(float)GetScreenHeight()/2 };
- float zoom = 1.0f;
-
- Vector2 offsetSpeed = { 0.0f, 0.0f };
+ float offset[2] = { 0.0f, 0.0f };
+ float zoom = startingZoom;
// Get variable (uniform) locations on the shader to connect with the program
// NOTE: If uniform variable could not be found in the shader, function returns -1
@@ -72,17 +73,13 @@ int main(void)
int zoomLoc = GetShaderLocation(shader, "zoom");
int offsetLoc = GetShaderLocation(shader, "offset");
- // Tell the shader what the screen dimensions, zoom, offset and c are
- float screenDims[2] = { (float)GetScreenWidth(), (float)GetScreenHeight() };
- SetShaderValue(shader, GetShaderLocation(shader, "screenDims"), screenDims, SHADER_UNIFORM_VEC2);
-
+ // Upload the shader uniform values!
SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
int incrementSpeed = 0; // Multiplier of speed to change c value
bool showControls = true; // Show controls
- bool pause = false; // Pause animation
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
//--------------------------------------------------------------------------------------
@@ -110,42 +107,50 @@ int main(void)
SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
}
- if (IsKeyPressed(KEY_SPACE)) pause = !pause; // Pause animation (c change)
- if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
-
- if (!pause)
+ // If "R" is pressed, reset zoom and offset.
+ if (IsKeyPressed(KEY_R))
{
- if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
- else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
-
- // TODO: The idea is to zoom and move around with mouse
- // Probably offset movement should be proportional to zoom level
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
- {
- if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) zoom += zoom*0.003f;
- if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT)) zoom -= zoom*0.003f;
-
- Vector2 mousePos = GetMousePosition();
+ zoom = startingZoom;
+ offset[0] = 0.0f;
+ offset[1] = 0.0f;
+ SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
+ SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
+ }
- offsetSpeed.x = mousePos.x -(float)screenWidth/2;
- offsetSpeed.y = mousePos.y -(float)screenHeight/2;
+ if (IsKeyPressed(KEY_SPACE)) incrementSpeed = 0; // Pause animation (c change)
+ if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
- // Slowly move camera to targetOffset
- offset[0] += GetFrameTime()*offsetSpeed.x*0.8f;
- offset[1] += GetFrameTime()*offsetSpeed.y*0.8f;
- }
- else offsetSpeed = (Vector2){ 0.0f, 0.0f };
+ if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
+ else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
+ // If either left or right button is pressed, zoom in/out.
+ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT) || IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
+ {
+ // Change zoom. If Mouse left -> zoom in. Mouse right -> zoom out.
+ zoom *= IsMouseButtonDown(MOUSE_BUTTON_LEFT)? zoomSpeed : 1.0f/zoomSpeed;
+
+ const Vector2 mousePos = GetMousePosition();
+ Vector2 offsetVelocity;
+ // Find the velocity at which to change the camera. Take the distance of the mouse
+ // from the center of the screen as the direction, and adjust magnitude based on
+ // the current zoom.
+ offsetVelocity.x = (mousePos.x/(float)screenWidth - 0.5f)*offsetSpeedMul/zoom;
+ offsetVelocity.y = (mousePos.y/(float)screenHeight - 0.5f)*offsetSpeedMul/zoom;
+
+ // Apply move velocity to camera
+ offset[0] += GetFrameTime()*offsetVelocity.x;
+ offset[1] += GetFrameTime()*offsetVelocity.y;
+
+ // Update the shader uniform values!
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
-
- // Increment c value with time
- float amount = GetFrameTime()*incrementSpeed*0.0005f;
- c[0] += amount;
- c[1] += amount;
-
- SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
}
+
+ // Increment c value with time
+ const float dc = GetFrameTime()*(float)incrementSpeed*0.0005f;
+ c[0] += dc;
+ c[1] += dc;
+ SetShaderValue(shader, cLoc, c, SHADER_UNIFORM_VEC2);
//----------------------------------------------------------------------------------
// Draw
@@ -178,7 +183,8 @@ int main(void)
DrawText("Press KEY_F1 to toggle these controls", 10, 30, 10, RAYWHITE);
DrawText("Press KEYS [1 - 6] to change point of interest", 10, 45, 10, RAYWHITE);
DrawText("Press KEY_LEFT | KEY_RIGHT to change speed", 10, 60, 10, RAYWHITE);
- DrawText("Press KEY_SPACE to pause movement animation", 10, 75, 10, RAYWHITE);
+ DrawText("Press KEY_SPACE to stop movement animation", 10, 75, 10, RAYWHITE);
+ DrawText("Press KEY_R to recenter the camera", 10, 90, 10, RAYWHITE);
}
EndDrawing();
//----------------------------------------------------------------------------------