feat: cycle animation with C key

This commit is contained in:
ktyl 2024-03-04 07:57:42 +00:00
parent 0b4e84323c
commit 5ff74be9fe
3 changed files with 63 additions and 12 deletions

View File

@ -46,14 +46,41 @@
#include "orbiter.hpp" #include "orbiter.hpp"
#include "widget.hpp" #include "widget.hpp"
// INPUT!
//
// what input do we even want in the first place?
// * camera controls - this is a rendering only concern which needn't affect the orbital
// * model validation - we want to modify orbits over time to confirm that our model is
// working properly
//
// TODO: input can only be directly handled by static methods, so we need to find a way to collect
// input from object instances and handle it at a higher level. in the case of this class, we want
// to determine when a configurable key is pressed. alternatively, we can split the behaviour into
// multiple sub-classes and run different loops at the top level?
//
// another idea is to process all input into a well-defined Input struct in the main loop, then
// pass this struct into objects' render() method.
//
// it's possible the first idea makes the most sense if the plan is to ultimately extract the orbit
// stuff to a library, since it keeps input a separate concern from the physics model
struct Input
{
bool cycleAnimation;
} input;
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{ {
if (key == GLFW_KEY_C && action == GLFW_PRESS) if (key == GLFW_KEY_C && action == GLFW_PRESS)
{ {
std::cout << "lol!" << std::endl; input.cycleAnimation = true;
} }
} }
void clearInput()
{
input.cycleAnimation = false;
}
int main() int main()
{ {
GLFWwindow* window = nullptr; GLFWwindow* window = nullptr;
@ -78,22 +105,29 @@ int main()
Orbiter orbiter(orbiterSphere, orbit, unlitProgram); Orbiter orbiter(orbiterSphere, orbit, unlitProgram);
// register input // register input
// TODO: init objects with a reference to the window so that they can register
// their own key inputs
glfwSetKeyCallback(window, keyCallback); glfwSetKeyCallback(window, keyCallback);
// Main loop // Main loop
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
{ {
// TODO: receive input from GLFW // receive input - key callback populates input struct defined further up,
// clearInput() needs to be called to clear input from previous frame
clearInput();
glfwPollEvents(); glfwPollEvents();
// apply input
if (input.cycleAnimation)
{
orbiter.cycleAnimation();
}
// rendering // rendering
glClearColor(0.2, 0.3, 0.3, 1.0); glClearColor(0.2, 0.3, 0.3, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float time = glfwGetTime(); float time = glfwGetTime();
planet.render(time);
orbiter.render(time); orbiter.render(time);
glfwSwapBuffers(window); glfwSwapBuffers(window);

View File

@ -1,13 +1,12 @@
#include "orbiter.hpp" #include "orbiter.hpp"
#include <GLFW/glfw3.h>
#include <iostream> #include <iostream>
#include <astro/stateVectorIndices.hpp> #include <astro/stateVectorIndices.hpp>
Orbiter::Orbiter(Icosphere& sphere, Orbit& orbit, GLuint unlitShaderProgram) : Orbiter::Orbiter(Icosphere& sphere, Orbit& orbit, GLuint shaderProgram) :
_sphere(sphere), _sphere(sphere),
_orbit(orbit), _orbit(orbit),
_widget(unlitShaderProgram) _widget(shaderProgram)
{ {
} }
@ -17,19 +16,29 @@ float Orbiter::getMeanAnomaly()
return time; return time;
} }
void Orbiter::cycleAnimation()
{
_animation++;
if (_animation > ANIM_ECCENTRICITY)
{
_animation = 0;
}
}
glm::vec3 Orbiter::getPosition(const float time) glm::vec3 Orbiter::getPosition(const float time)
{ {
std::vector<float> keplerianElements(6); std::vector<float> keplerianElements(6);
_orbit.getElements(keplerianElements); _orbit.getElements(keplerianElements);
int animation = (int)(time/ORBITAL_PERIOD) % 2 == 1; //int animation = (int)(time/ORBITAL_PERIOD) % 2 == 1;
if (animation == ANIM_ORBITING) if (_animation == ANIM_ORBITING)
return _orbit.getPosition(time); return _orbit.getPosition(time);
// TODO: i want to modify the eccentricity of the orbit with a control, // TODO: i want to modify the eccentricity of the orbit with a control,
// not an automatic animation // not an automatic animation
if (animation == ANIM_ECCENTRICITY) if (_animation == ANIM_ECCENTRICITY)
{ {
// TODO: what are these magic numbers // TODO: what are these magic numbers
float e = .25 + .2 * sin(time); float e = .25 + .2 * sin(time);
@ -40,7 +49,7 @@ glm::vec3 Orbiter::getPosition(const float time)
return _orbit.getPosition(0); return _orbit.getPosition(0);
} }
std::cerr << "unknown animation " << animation << std::endl; std::cerr << "unknown animation " << _animation << std::endl;
throw 1; throw 1;
} }

View File

@ -1,17 +1,22 @@
#pragma once #pragma once
#include "gfx.hpp"
#include "icosphere.hpp" #include "icosphere.hpp"
#include "orbit.hpp" #include "orbit.hpp"
#include "widget.hpp" #include "widget.hpp"
#include <GLFW/glfw3.h>
class Orbiter class Orbiter
{ {
public: public:
Orbiter(Icosphere& sphere, Orbit& orbit, GLuint unlitShaderProgram); Orbiter(Icosphere& sphere, Orbit& orbit, GLuint shaderProgram);
~Orbiter(); ~Orbiter();
void render(const float time); void render(const float time);
void cycleAnimation();
private: private:
void updateModelMatrix(); void updateModelMatrix();
float getMeanAnomaly(); float getMeanAnomaly();
@ -24,6 +29,9 @@ private:
const float ORBITAL_PERIOD = 6.284; const float ORBITAL_PERIOD = 6.284;
// TODO: convert these to an enum
const int ANIM_ORBITING = 0; const int ANIM_ORBITING = 0;
const int ANIM_ECCENTRICITY = 1; const int ANIM_ECCENTRICITY = 1;
int _animation = ANIM_ORBITING;
}; };