Actually fix zoom. Also allow user to reset camera with 'R'
This commit is contained in:
parent
2aca875877
commit
efb5de646d
|
|
@ -6,7 +6,6 @@ precision mediump float;
|
||||||
varying vec2 fragTexCoord;
|
varying vec2 fragTexCoord;
|
||||||
varying vec4 fragColor;
|
varying vec4 fragColor;
|
||||||
|
|
||||||
uniform vec2 screenDims; // Dimensions of the screen
|
|
||||||
uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
|
uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
|
||||||
uniform vec2 offset; // Offset of the scale.
|
uniform vec2 offset; // Offset of the scale.
|
||||||
uniform float zoom; // Zoom of the scale.
|
uniform float zoom; // Zoom of the scale.
|
||||||
|
|
@ -57,7 +56,9 @@ void main()
|
||||||
|
|
||||||
// The pixel coordinates are scaled so they are on the mandelbrot scale
|
// The pixel coordinates are scaled so they are on the mandelbrot scale
|
||||||
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
|
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
|
||||||
vec2 z = vec2((fragTexCoord.x + offset.x/screenDims.x)*2.5/zoom, (fragTexCoord.y + offset.y/screenDims.y)*1.5/zoom);
|
vec2 z = vec2((fragTexCoord.x - 0.5) * 2.5, (fragTexCoord.y - 0.5) * 1.5) / zoom;
|
||||||
|
z.x += offset.x;
|
||||||
|
z.y += offset.y;
|
||||||
|
|
||||||
int iter = 0;
|
int iter = 0;
|
||||||
for (int iterations = 0; iterations < 60; iterations++)
|
for (int iterations = 0; iterations < 60; iterations++)
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,9 @@ void main()
|
||||||
|
|
||||||
// The pixel coordinates are scaled so they are on the mandelbrot scale
|
// The pixel coordinates are scaled so they are on the mandelbrot scale
|
||||||
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
|
// NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
|
||||||
vec2 z = vec2((fragTexCoord.x + offset.x)*2.5/zoom, (fragTexCoord.y + offset.y)*1.5/zoom);
|
vec2 z = vec2((fragTexCoord.x - 0.5) * 2.5, (fragTexCoord.y - 0.5) * 1.5) / zoom;
|
||||||
|
z.x += offset.x;
|
||||||
|
z.y += offset.y;
|
||||||
|
|
||||||
int iterations = 0;
|
int iterations = 0;
|
||||||
for (iterations = 0; iterations < MAX_ITERATIONS; iterations++)
|
for (iterations = 0; iterations < MAX_ITERATIONS; iterations++)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,13 @@ const float pointsOfInterest[6][2] =
|
||||||
{ -0.70176f, -0.3842f },
|
{ -0.70176f, -0.3842f },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const int screenWidth = 1920;
|
||||||
|
const int screenHeight = 1080;
|
||||||
|
const float zoomSpeed = 1.01f;
|
||||||
|
const float offsetSpeedMul = 2.0f;
|
||||||
|
|
||||||
|
const float startingZoom = 0.75f;
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
|
@ -44,10 +51,6 @@ int main(void)
|
||||||
{
|
{
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
const int screenWidth = 1920 * 1.5;
|
|
||||||
const int screenHeight = 1080 * 1.5;
|
|
||||||
const float zoomSpeed = 1.005f;
|
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets");
|
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - julia sets");
|
||||||
|
|
||||||
// Load julia set shader
|
// Load julia set shader
|
||||||
|
|
@ -61,8 +64,8 @@ int main(void)
|
||||||
float c[2] = { pointsOfInterest[0][0], pointsOfInterest[0][1] };
|
float c[2] = { pointsOfInterest[0][0], pointsOfInterest[0][1] };
|
||||||
|
|
||||||
// Offset and zoom to draw the julia set at. (centered on screen and default size)
|
// Offset and zoom to draw the julia set at. (centered on screen and default size)
|
||||||
float offset[2] = { -0.5, -0.5 };
|
float offset[2] = { 0.0, 0.0 };
|
||||||
float zoom = 1.0f;
|
float zoom = startingZoom;
|
||||||
|
|
||||||
// Get variable (uniform) locations on the shader to connect with the program
|
// 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
|
// NOTE: If uniform variable could not be found in the shader, function returns -1
|
||||||
|
|
@ -76,7 +79,6 @@ int main(void)
|
||||||
|
|
||||||
int incrementSpeed = 0; // Multiplier of speed to change c value
|
int incrementSpeed = 0; // Multiplier of speed to change c value
|
||||||
bool showControls = true; // Show controls
|
bool showControls = true; // Show controls
|
||||||
bool pause = false; // Pause animation
|
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
@ -99,41 +101,47 @@ int main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsKeyPressed(KEY_SPACE)) pause = !pause; // Pause animation (c change)
|
// If "R" is pressed, reset zoom and offset.
|
||||||
|
if (IsKeyPressed(KEY_R))
|
||||||
|
{
|
||||||
|
zoom = startingZoom;
|
||||||
|
offset[0] = 0.0;
|
||||||
|
offset[1] = 0.0;
|
||||||
|
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
|
||||||
|
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsKeyPressed(KEY_SPACE)) incrementSpeed = 0; // Pause animation (c change)
|
||||||
if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
|
if (IsKeyPressed(KEY_F1)) showControls = !showControls; // Toggle whether or not to show controls
|
||||||
|
|
||||||
if (!pause)
|
if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
|
||||||
|
else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
|
||||||
|
|
||||||
|
// If either left or right button is pressed, zoom in/out.
|
||||||
|
const bool leftMouseButtonDown = IsMouseButtonDown(MOUSE_BUTTON_LEFT);
|
||||||
|
if (leftMouseButtonDown ^ IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
||||||
{
|
{
|
||||||
if (IsKeyPressed(KEY_RIGHT)) incrementSpeed++;
|
// Change zoom. If Mouse left -> zoom in. Mouse right -> zoom out.
|
||||||
else if (IsKeyPressed(KEY_LEFT)) incrementSpeed--;
|
zoom *= leftMouseButtonDown ? zoomSpeed : 1.0f / zoomSpeed;
|
||||||
|
|
||||||
// If either left or right button is pressed, zoom in/out.
|
const Vector2 mousePos = GetMousePosition();
|
||||||
const bool leftMouseButtonDown = IsMouseButtonDown(MOUSE_BUTTON_LEFT);
|
Vector2 offsetVelocity;
|
||||||
if (leftMouseButtonDown ^ IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
offsetVelocity.x = (mousePos.x/(float)screenWidth - 0.5) * offsetSpeedMul / zoom;
|
||||||
{
|
offsetVelocity.y = (mousePos.y/(float)screenHeight - 0.5) * offsetSpeedMul / zoom;
|
||||||
// Change zoom. If Mouse left -> zoom in. Mouse right -> zoom out.
|
|
||||||
zoom *= leftMouseButtonDown ? zoomSpeed : 1.0f / zoomSpeed;
|
|
||||||
|
|
||||||
const Vector2 mousePos = GetMousePosition();
|
// Apply move velocity to camera
|
||||||
Vector2 offsetVelocity;
|
offset[0] += GetFrameTime() * offsetVelocity.x;
|
||||||
offsetVelocity.x = zoom * (mousePos.x/(float)screenWidth - 0.5);
|
offset[1] += GetFrameTime() * offsetVelocity.y;
|
||||||
offsetVelocity.y = zoom * (mousePos.y/(float)screenHeight - 0.5);
|
|
||||||
|
|
||||||
// Apply move velocity to camera
|
SetShaderValue(shader, zoomLoc, &zoom, SHADER_UNIFORM_FLOAT);
|
||||||
offset[0] += GetFrameTime() * offsetVelocity.x;
|
SetShaderValue(shader, offsetLoc, offset, SHADER_UNIFORM_VEC2);
|
||||||
offset[1] += GetFrameTime() * offsetVelocity.y;
|
|
||||||
|
|
||||||
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
|
// Draw
|
||||||
|
|
@ -166,7 +174,8 @@ int main(void)
|
||||||
DrawText("Press KEY_F1 to toggle these controls", 10, 30, 10, RAYWHITE);
|
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 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_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();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user