|
@@ -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();
|
|
|
//----------------------------------------------------------------------------------
|