Work on the GUI

This commit is contained in:
Daniel Chappuis 2015-06-30 19:50:17 +02:00
parent 80cf65ccf2
commit 82f6bf2dbb
5 changed files with 106 additions and 15 deletions

View File

@ -373,7 +373,7 @@ inline Vector3 DynamicsWorld::getGravity() const {
/**
* @param gravity The gravity vector (in meter per seconds squared)
*/
inline Vector3 DynamicsWorld::setGravity(Vector3& gravity) {
inline void DynamicsWorld::setGravity(Vector3& gravity) {
mGravity = gravity;
}

View File

@ -107,6 +107,8 @@ void Gui::init() {
void Gui::displayHeader() {
TestbedApplication& app = TestbedApplication::getInstance();
ImVec2 buttonSize(120, 40);
int display_w, display_h;
@ -122,10 +124,23 @@ void Gui::displayHeader() {
ImGui::Begin("Header", NULL, ImVec2(display_w, HEADER_HEIGHT), 1.0f, window_flags);
ImGui::SetWindowPos(ImVec2(0, 0));
ImGui::Button("Play", buttonSize); ImGui::SameLine();
ImGui::Button("Pause", buttonSize); ImGui::SameLine();
ImGui::Button("Step", buttonSize); ImGui::SameLine();
ImGui::Button("Restart", buttonSize); ImGui::SameLine();
bool isRunning = app.mTimer.isRunning();
if (ImGui::Button(isRunning ? "Pause" : "Play", buttonSize)) {
app.togglePlayPauseSimulation();
}
ImGui::SameLine();
if (ImGui::Button("Step", buttonSize)) {
app.toggleTakeSinglePhysicsStep();
}
ImGui::SameLine();
if (ImGui::Button("Restart", buttonSize)) {
app.restartSimulation();
}
ImGui::SameLine();
ImGui::End();
ImGui::PopStyleColor(1);
@ -152,8 +167,16 @@ void Gui::displayLeftPane() {
ImGui::SetWindowPos(ImVec2(0, HEADER_HEIGHT));
// ----- Left Pane Header ----- //
ImGui::Button("Scenes", buttonSize); ImGui::SameLine();
ImGui::Button("Physics", buttonSize); ImGui::SameLine();
if (ImGui::Button("Scenes", buttonSize)) {
mLeftPane = SCENES;
}
ImGui::SameLine();
if (ImGui::Button("Physics", buttonSize)) {
mLeftPane = PHYSICS;
}
ImGui::SameLine();
ImGui::Button("Rendering", buttonSize); ImGui::SameLine();
ImGui::Button("Profiling", buttonSize);
@ -194,6 +217,11 @@ void Gui::displayScenesPane() {
void Gui::displayPhysicsPane() {
TestbedApplication& app = TestbedApplication::getInstance();
// Physics time step
//float timestep = app.ge;
//ImGui::InputFloat("Timestep", &timestep, 0.01f, 1.0f);
}
void Gui::displayRenderingPane() {
@ -241,10 +269,6 @@ void Gui::render() {
//glfwPollEvents();
beginNewFrame();
bool show_test_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImColor(255, 255, 255);
displayHeader();
displayLeftPane();

View File

@ -35,8 +35,16 @@ struct EngineSettings {
public:
float elapsedTime; // Elapsed time (in seconds)
float timeStep; // Current time step (in seconds)
float elapsedTime; // Elapsed time (in seconds)
float timeStep; // Current time step (in seconds)
int nbVelocitySolverIterations; // Nb of velocity solver iterations
int nbPositionSolverIterations; // Nb of position solver iterations
bool isSleepingEnabled; // True if sleeping technique is enabled
float timeBeforeSleep; // Time of inactivity before a body sleep
float sleepLinearVelocity; // Sleep linear velocity
float sleepAngularVelocity; // Sleep angular velocity
bool isGravityEnabled; // True if gravity is enabled
openglframework::Vector3 gravity; // Gravity vector
/// Constructor
EngineSettings() : elapsedTime(0.0f), timeStep(0.0f) {

View File

@ -50,13 +50,15 @@ TestbedApplication& TestbedApplication::getInstance() {
}
// Constructor
TestbedApplication::TestbedApplication() : mFPS(0), mNbFrames(0), mPreviousTime(0){
TestbedApplication::TestbedApplication() : mFPS(0), mNbFrames(0), mPreviousTime(0) {
mCurrentScene = NULL;
mEngineSettings.timeStep = DEFAULT_TIMESTEP;
mIsMultisamplingActive = true;
mWidth = 1280;
mHeight = 720;
mSinglePhysicsStepEnabled = false;
mSinglePhysicsStepDone = false;
}
// Destructor
@ -175,6 +177,13 @@ void TestbedApplication::destroyScenes() {
mCurrentScene = NULL;
}
void TestbedApplication::updateSinglePhysicsStep() {
assert(!mTimer.isRunning());
mCurrentScene->updatePhysics();
}
// Update the physics of the current scene
void TestbedApplication::updatePhysics() {
@ -202,7 +211,13 @@ void TestbedApplication::updatePhysics() {
void TestbedApplication::update() {
// Update the physics
updatePhysics();
if (mSinglePhysicsStepEnabled && !mSinglePhysicsStepDone) {
updateSinglePhysicsStep();
mSinglePhysicsStepDone = true;
}
else {
updatePhysics();
}
// Compute the interpolation factor
float factor = mTimer.computeInterpolationFactor(mEngineSettings.timeStep);

View File

@ -81,6 +81,12 @@ class TestbedApplication {
/// Width and height of the window
int mWidth, mHeight;
/// True if the next simulation update is a single physics step
bool mSinglePhysicsStepEnabled;
/// True if the single physics step has been taken already
bool mSinglePhysicsStepDone;
// -------------------- Methods -------------------- //
/// Private constructor (for the singleton class)
@ -98,6 +104,9 @@ class TestbedApplication {
/// Update
void update();
/// Update the simulation by taking a single physics step
void updateSinglePhysicsStep();
/// Called when the windows is reshaped
void reshape();
@ -140,6 +149,15 @@ class TestbedApplication {
/// Return the list of the scenes
std::vector<Scene*> getScenes();
/// Start/stop the simulation
void togglePlayPauseSimulation();
/// Restart the simulation
void restartSimulation();
/// Set the variable to know if we need to take a single physics step
void toggleTakeSinglePhysicsStep();
public :
// -------------------- Methods -------------------- //
@ -169,5 +187,31 @@ inline std::vector<Scene*> TestbedApplication::getScenes() {
return mScenes;
}
// Start the simulation
inline void TestbedApplication::togglePlayPauseSimulation() {
if (mTimer.isRunning()) {
mTimer.stop();
}
else {
mTimer.start();
}
}
// Restart the simulation
inline void TestbedApplication::restartSimulation() {
mCurrentScene->reset();
mTimer.start();
}
// Take a single step of simulation
inline void TestbedApplication::toggleTakeSinglePhysicsStep() {
mSinglePhysicsStepEnabled = true;
mSinglePhysicsStepDone = false;
if (mTimer.isRunning()) {
mSinglePhysicsStepEnabled = false;
}
}
#endif