Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
ProblemRouter.h
Go to the documentation of this file.
1#pragma once
2#include <string>
3#include <memory>
4#include "OneUnknownSolver.h"
5#include "VectorRootSolver.h"
6
7namespace Physics {
8 class PhysicsSystem;
9 class PhysicsBody;
10}
11
12enum class SolverMode {
13 SIMULATE, // no unknowns to solve for, just advance sim
14 SOLVE // unknown must be solved using VectorRootSolver
15};
16
19 std::unique_ptr<ISolver> solver; // nullptr if direct simulation
20};
21
23public:
24 explicit ProblemRouter(Physics::PhysicsSystem& physicsSystem);
25 std::unique_ptr<ISolver> makeSolver(Physics::PhysicsBody* body, const std::unordered_map<std::string, double> &knowns, const std::string &unknown) const;
26 SolverDecision routeProblem(Physics::PhysicsBody* body, const std::unordered_map<std::string,double>& knowns, const std::string& unknown) const;
27
28 std::vector<std::vector<std::string>> getRequiredKeys(const std::string& unknown) const;
29private:
30 Physics::PhysicsSystem& physicsSystem;
31
32 // Takes in knowns and returns a solver.
33 using SolverFactory = std::function<std::unique_ptr<ISolver>(Physics::PhysicsBody* body, const std::unordered_map<std::string,double>&)>;
34
35 struct SolverEntry {
36 std::vector<std::string> requiredKeys;
37 SolverFactory factory;
38 };
39
40 bool areRequirementsMet(const std::vector<std::string>& required, const std::unordered_map<std::string, double>& knowns) const;
41
42 // Maps an unknown to solve for to a vector of potential SolverFactories
43 // Can refactor the vector of SolverFactories to a tree later
44 std::unordered_map<std::string, std::vector<SolverEntry>> solverMap;
45 void registerKinematicsProblems();
46};
SolverMode mode
std::unique_ptr< ISolver > solver
SolverMode
std::vector< std::vector< std::string > > getRequiredKeys(const std::string &unknown) const
std::unique_ptr< ISolver > makeSolver(Physics::PhysicsBody *body, const std::unordered_map< std::string, double > &knowns, const std::string &unknown) const
SolverDecision routeProblem(Physics::PhysicsBody *body, const std::unordered_map< std::string, double > &knowns, const std::string &unknown) const