5#include <QStackedWidget>
17 layout =
new QFormLayout(
this);
18 layout->setContentsMargins(6, 6, 6, 6);
19 layout->setSpacing(4);
25void GlobalsInspectorWidget::createUiComponents() {
33 layout->addRow(row.getLabel(), row.getEditor());
34 rows.push_back(std::move(row));
45 widget->setDecimals(15);
47 ).addButton(
"Default scaled", [
this, physicSystem]() {
50 }).addButton(
"Realism (reset)", [
this, physicSystem]() {
54 layout->addRow(row.getLabel(), row.getEditor());
55 rows.push_back(std::move(row));
65 widget->setRange(0.0, 1.0e12);
68 layout->addRow(row.getLabel(), row.getEditor());
69 rows.push_back(std::move(row));
79 ).addButton(
"Room Temp", [
this, physicSystem]() {
83 layout->addRow(row.getLabel(), row.getEditor());
84 rows.push_back(std::move(row));
87 createStopConditionUi();
99 QPushButton* solveBtn =
new QPushButton(
"SOLVE PHYSICS");
100 solveBtn->setFixedHeight(30);
105 layout->addRow(row.getLabel(), row.getEditor());
106 rows.push_back(std::move(row));
110void GlobalsInspectorWidget::createStopConditionUi() {
111 QWidget* logicContainer =
new QWidget();
112 logicContainer->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
113 QVBoxLayout* mainContainerLayout =
new QVBoxLayout(logicContainer);
114 mainContainerLayout->setContentsMargins(0, 0, 0, 0);
115 mainContainerLayout->setSpacing(2);
117 QWidget* equationRow =
new QWidget();
118 QHBoxLayout* equationLayout =
new QHBoxLayout(equationRow);
119 equationLayout->setContentsMargins(0, 0, 0, 0);
121 QComboBox* subjectCombo =
new QComboBox();
122 QComboBox* propCombo =
new QComboBox();
123 QComboBox* opCombo =
new QComboBox();
126 QStackedWidget* parameterStack =
new QStackedWidget();
127 parameterStack->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
129 QWidget* emptyPage =
new QWidget();
130 emptyPage->setFixedHeight(0);
131 parameterStack->addWidget(emptyPage);
133 QComboBox* targetObjCombo =
new QComboBox();
134 parameterStack->addWidget(targetObjCombo);
137 parameterStack->addWidget(targetVecWidget);
139 subjectCombo->addItem(
"-- Subject --", -1);
140 for (
const auto& objPtr : sceneManager->getObjects()) {
144 connect(subjectCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), [
this, subjectCombo](
int){
149 propCombo->addItem(
"Pos Y", 0);
150 propCombo->addItem(
"Vel Y", 1);
151 propCombo->addItem(
"Dist to Obj", 2);
152 propCombo->addItem(
"Dist to Point", 3);
153 connect(propCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), [
this](
int idx){
158 opCombo->addItem(
"<", 0);
159 opCombo->addItem(
">", 1);
160 connect(opCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), [
this](
int idx){
168 connect(targetObjCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), [
this, targetObjCombo](
int){
176 equationLayout->addWidget(subjectCombo);
177 equationLayout->addWidget(propCombo);
178 equationLayout->addWidget(opCombo);
179 equationLayout->addWidget(thresholdWidget);
181 mainContainerLayout->addWidget(equationRow);
182 mainContainerLayout->addWidget(parameterStack);
184 auto updateLogic = [
this, subjectCombo, propCombo, opCombo, thresholdWidget, parameterStack, targetObjCombo, targetVecWidget]() {
186 const QSignalBlocker b1(subjectCombo);
187 subjectCombo->setCurrentIndex(subjIdx != -1 ? subjIdx : 0);
189 if (subjectCombo->count() != sceneManager->
getObjects().size() + 1) {
190 subjectCombo->clear();
191 subjectCombo->addItem(
"-- Subject --", -1);
192 for (
const auto& objPtr : sceneManager->getObjects()) {
197 subjectCombo->setCurrentIndex(subjIdx != -1 ? subjIdx : 0);
200 const QSignalBlocker b2(propCombo);
203 const QSignalBlocker b3(opCombo);
206 const QSignalBlocker b4(thresholdWidget);
211 parameterStack->setCurrentIndex(1);
212 parameterStack->setVisible(
true);
214 if (targetObjCombo->count() != sceneManager->
getObjects().size()) {
215 const QSignalBlocker b(targetObjCombo);
216 targetObjCombo->clear();
217 for (
const auto& objPtr : sceneManager->getObjects()) {
224 if (tIdx != -1 && targetObjCombo->currentIndex() != tIdx) {
225 const QSignalBlocker b(targetObjCombo);
226 targetObjCombo->setCurrentIndex(tIdx);
229 else if (prop == 3) {
230 parameterStack->setCurrentIndex(2);
231 parameterStack->setVisible(
true);
233 const QSignalBlocker b5(targetVecWidget);
237 parameterStack->setCurrentIndex(0);
238 parameterStack->setVisible(
false);
242 propCombo->setEnabled(active);
243 opCombo->setEnabled(active);
244 thresholdWidget->setEnabled(active);
245 parameterStack->setEnabled(active);
250 InspectorRow row(
"Stop Condition", logicContainer, updateLogic);
251 layout->addRow(row.getLabel(), row.getEditor());
252 rows.push_back(std::move(row));
265 for (
auto& row : rows)
271 if (cond.subjectID == -1)
return;
276 std::unordered_map<std::string, double> knowns;
280 knowns[
"r0_x"] = r0.x;
281 knowns[
"r0_y"] = r0.y;
282 knowns[
"r0_z"] = r0.z;
287 knowns[
"v0_x"] = v0.x;
288 knowns[
"v0_y"] = v0.y;
289 knowns[
"v0_z"] = v0.z;
292 knowns[
"Stop_SubjectID"] = (double)cond.subjectID;
293 knowns[
"Stop_Prop"] = (double)cond.property;
294 knowns[
"Stop_Op"] = (double)cond.op;
295 knowns[
"Stop_Val"] = (double)cond.value;
296 knowns[
"Stop_TargetID"] = (double)cond.targetID;
298 knowns[
"Stop_Val_X"] = cond.targetPos.x;
299 knowns[
"Stop_Val_Y"] = cond.targetPos.y;
300 knowns[
"Stop_Val_Z"] = cond.targetPos.z;
304 std::string unknownKey =
"Event";
312 double targetTime = -1.0;
313 if (timeConstraint) {
314 targetTime = timeConstraint->
getValue();
315 if (targetTime <= 0.0001) targetTime = -1.0;
317 knowns[
"Target_Time"] = targetTime;
320 for (
const auto& objPtr : sceneManager->
getObjects()) {
322 if (
static_cast<int>(obj->
getObjectID()) == cond.subjectID) {
332 sceneManager->
physicsSystem->solveProblem(body, knowns, unknownKey);
Abstract base class for inspector panel sections.
bool isUnknown(const std::string &key, BodyLock lock) const
glm::vec3 getVelocity(BodyLock lock) const
glm::vec3 getPosition(BodyLock lock) const
void setAmbientTemperature(float newTemp)
float getAmbientTemperature() const
void setGravitationalConstant(double newG)
double getGravitationalConstant() const
void setSimSpeed(float newSpeed)
void setGlobalAcceleration(const glm::vec3 &newAcceleration) const
std::unique_ptr< Physics::PhysicsSystem > physicsSystem
SimulationStopCondition stopCondition
void setCameraTarget(SceneObject *target)
glm::vec3 getGlobalAcceleration() const
float getSimSpeed() const
const std::vector< std::unique_ptr< SceneObject > > & getObjects() const
const std::string & getName() const
uint32_t getObjectID() const override
Gets the unique identifier for this object.
constexpr double G_SCALED