PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/gui/CollisionSolverSettingsDialog.cpp

https://bitbucket.org/senseiwa/bullet-physics
C++ | 211 lines | 173 code | 34 blank | 4 comment | 1 complexity | fe05df5b8ab94b4381f8908513eb0b93 MD5 | raw file
  1. #include "CollisionSolverSettingsDialog.hpp"
  2. CollisionSolverSettingsDialog::CollisionSolverSettingsDialog(QWidget *parent, Designer *d) :
  3. QDialog(parent)
  4. {
  5. designer = d;
  6. setModal(true);
  7. setFocusPolicy(Qt::StrongFocus);
  8. setFocus();
  9. setWindowTitle(tr("Simulator Settings"));
  10. QGridLayout *layout = new QGridLayout;
  11. int i = 0;
  12. tauBox = new QDoubleSpinBox;
  13. tauBox->setDecimals(1);
  14. tauBox->setRange(0.0, 1.0);
  15. tauBox->setSingleStep(0.1);
  16. tauBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_tau);
  17. layout->addWidget(new QLabel(tr("tau")), i, 0);
  18. layout->addWidget(tauBox, i, 1);
  19. i++;
  20. dampingBox = new QDoubleSpinBox;
  21. dampingBox->setDecimals(1);
  22. dampingBox->setRange(0.0, 1.0);
  23. dampingBox->setSingleStep(0.1);
  24. dampingBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_damping);
  25. layout->addWidget(new QLabel(tr("damping")), i, 0);
  26. layout->addWidget(dampingBox, i, 1);
  27. i++;
  28. frictionBox = new QDoubleSpinBox;
  29. frictionBox->setDecimals(1);
  30. frictionBox->setRange(0.0, 1.0);
  31. frictionBox->setSingleStep(0.1);
  32. frictionBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_friction);
  33. layout->addWidget(new QLabel(tr("friction")), i, 0);
  34. layout->addWidget(frictionBox, i, 1);
  35. i++;
  36. timeStepBox = new QDoubleSpinBox;
  37. timeStepBox->setDecimals(5);
  38. timeStepBox->setRange(0.0, 1.0);
  39. timeStepBox->setSingleStep( (1.0f/60.0f) );
  40. timeStepBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_timeStep);
  41. layout->addWidget(new QLabel(tr("time step")), i, 0);
  42. layout->addWidget(timeStepBox, i, 1);
  43. i++;
  44. restitutionBox = new QDoubleSpinBox;
  45. restitutionBox->setDecimals(1);
  46. restitutionBox->setRange(0.0, 1.0);
  47. restitutionBox->setSingleStep(0.1);
  48. restitutionBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_restitution);
  49. layout->addWidget(new QLabel(tr("restitution")), i, 0);
  50. layout->addWidget(restitutionBox, i, 1);
  51. i++;
  52. numIterationsBox = new QDoubleSpinBox;
  53. numIterationsBox->setDecimals(0);
  54. numIterationsBox->setRange(0.0, 100.0);
  55. numIterationsBox->setSingleStep(1.0);
  56. numIterationsBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_numIterations);
  57. layout->addWidget(new QLabel(tr("num iterations")), i, 0);
  58. layout->addWidget(numIterationsBox, i, 1);
  59. i++;
  60. maxErrorReductionBox = new QDoubleSpinBox;
  61. maxErrorReductionBox->setDecimals(1);
  62. maxErrorReductionBox->setRange(0.0, 100.0);
  63. maxErrorReductionBox->setSingleStep(1.0);
  64. maxErrorReductionBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_maxErrorReduction);
  65. layout->addWidget(new QLabel(tr("max error reduction")), i, 0);
  66. layout->addWidget(maxErrorReductionBox, i, 1);
  67. i++;
  68. sorBox = new QDoubleSpinBox;
  69. sorBox->setDecimals(2);
  70. sorBox->setRange(0.0, 10.0);
  71. sorBox->setSingleStep(0.1);
  72. sorBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_sor);
  73. layout->addWidget(new QLabel(tr("sor")), i, 0);
  74. layout->addWidget(sorBox, i, 1);
  75. i++;
  76. erpBox = new QDoubleSpinBox;
  77. erpBox->setDecimals(2);
  78. erpBox->setRange(0.0, 1.0);
  79. erpBox->setSingleStep(0.1);
  80. erpBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_erp);
  81. layout->addWidget(new QLabel(tr("erp (used as Baumgarte factor)")), i, 0);
  82. layout->addWidget(erpBox, i, 1);
  83. i++;
  84. erp2Box = new QDoubleSpinBox;
  85. erp2Box->setDecimals(2);
  86. erp2Box->setRange(0.0, 1.0);
  87. erp2Box->setSingleStep(0.1);
  88. erp2Box->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_erp2);
  89. layout->addWidget(new QLabel(tr("erp2 (used in Split Impulse)")), i, 0);
  90. layout->addWidget(erp2Box, i, 1);
  91. i++;
  92. globalCfmBox = new QDoubleSpinBox;
  93. globalCfmBox->setDecimals(2);
  94. globalCfmBox->setRange(0.0, 1.0);
  95. globalCfmBox->setSingleStep(0.1);
  96. globalCfmBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_globalCfm);
  97. layout->addWidget(new QLabel(tr("global Cfm (Constraint force mixing)")), i, 0);
  98. layout->addWidget(globalCfmBox, i, 1);
  99. i++;
  100. splitImpulseBox = new QCheckBox;
  101. splitImpulseBox->setChecked( this->designer->simulator->dynamicsWorld->getSolverInfo().m_splitImpulse == 1 );
  102. layout->addWidget(new QLabel(tr("split impulse")), i, 0);
  103. layout->addWidget(splitImpulseBox, i, 1);
  104. i++;
  105. splitImpulsePenetrationThresholdBox = new QDoubleSpinBox;
  106. splitImpulsePenetrationThresholdBox->setDecimals(3);
  107. splitImpulsePenetrationThresholdBox->setRange(-10.0, 10.0);
  108. splitImpulsePenetrationThresholdBox->setSingleStep(0.05);
  109. splitImpulsePenetrationThresholdBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_splitImpulsePenetrationThreshold);
  110. layout->addWidget(new QLabel(tr("split impulse penetration threshold")), i, 0);
  111. layout->addWidget(splitImpulsePenetrationThresholdBox, i, 1);
  112. i++;
  113. linearSlopBox = new QDoubleSpinBox;
  114. linearSlopBox->setDecimals(1);
  115. linearSlopBox->setRange(0.0, 1.0);
  116. linearSlopBox->setSingleStep(0.1);
  117. linearSlopBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_linearSlop);
  118. layout->addWidget(new QLabel(tr("linear slop")), i, 0);
  119. layout->addWidget(linearSlopBox, i, 1);
  120. i++;
  121. warmstartingFactorBox = new QDoubleSpinBox;
  122. warmstartingFactorBox->setDecimals(2);
  123. warmstartingFactorBox->setRange(0.0, 1.0);
  124. warmstartingFactorBox->setSingleStep(0.05);
  125. warmstartingFactorBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_warmstartingFactor);
  126. layout->addWidget(new QLabel(tr("warmstarting factor")), i, 0);
  127. layout->addWidget(warmstartingFactorBox, i, 1);
  128. i++;
  129. /*
  130. QDoubleSpinBox* solverModeBox;
  131. */
  132. restingContactRestitutionThresholdBox = new QDoubleSpinBox;
  133. restingContactRestitutionThresholdBox->setDecimals(2);
  134. restingContactRestitutionThresholdBox->setRange(0.0, 1.0);
  135. restingContactRestitutionThresholdBox->setSingleStep(0.05);
  136. restingContactRestitutionThresholdBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_restingContactRestitutionThreshold);
  137. layout->addWidget(new QLabel(tr("resting contact restitution threshold")), i, 0);
  138. layout->addWidget(restingContactRestitutionThresholdBox, i, 1);
  139. i++;
  140. minimumSolverBatchSizeBox = new QDoubleSpinBox;
  141. minimumSolverBatchSizeBox->setDecimals(0);
  142. minimumSolverBatchSizeBox->setRange(0.0, 256);
  143. minimumSolverBatchSizeBox->setSingleStep(10);
  144. minimumSolverBatchSizeBox->setValue( this->designer->simulator->dynamicsWorld->getSolverInfo().m_minimumSolverBatchSize);
  145. layout->addWidget(new QLabel(tr("minimum solver batch size")), i, 0);
  146. layout->addWidget(minimumSolverBatchSizeBox, i, 1);
  147. i++;
  148. QPushButton* buttonAccept = new QPushButton("OK");
  149. QPushButton* buttonCancel = new QPushButton("CANCEL");
  150. layout->addWidget(buttonAccept, i, 0);
  151. layout->addWidget(buttonCancel, i, 1);
  152. connect(buttonAccept, SIGNAL(clicked()), this, SLOT(accept()));
  153. connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
  154. setLayout(layout);
  155. }
  156. void CollisionSolverSettingsDialog::accept()
  157. {
  158. this->designer->simulator->dynamicsWorld->getSolverInfo().m_tau = (float)tauBox->value();
  159. this->designer->simulator->dynamicsWorld->getSolverInfo().m_damping = (float)dampingBox->value();
  160. this->designer->simulator->dynamicsWorld->getSolverInfo().m_friction = (float)frictionBox->value();
  161. this->designer->simulator->dynamicsWorld->getSolverInfo().m_timeStep = (float)timeStepBox->value();
  162. this->designer->simulator->dynamicsWorld->getSolverInfo().m_restitution = (float)restitutionBox->value();
  163. this->designer->simulator->dynamicsWorld->getSolverInfo().m_numIterations = (float)numIterationsBox->value();
  164. this->designer->simulator->dynamicsWorld->getSolverInfo().m_maxErrorReduction = (float)maxErrorReductionBox->value();
  165. this->designer->simulator->dynamicsWorld->getSolverInfo().m_sor = (float)sorBox->value();
  166. this->designer->simulator->dynamicsWorld->getSolverInfo().m_erp = (float)erpBox->value();
  167. this->designer->simulator->dynamicsWorld->getSolverInfo().m_erp2 = (float)erp2Box->value();
  168. this->designer->simulator->dynamicsWorld->getSolverInfo().m_globalCfm = (float)globalCfmBox->value();
  169. this->designer->simulator->dynamicsWorld->getSolverInfo().m_splitImpulse = splitImpulseBox->isChecked() ? 1.0 : 0.0;
  170. this->designer->simulator->dynamicsWorld->getSolverInfo().m_splitImpulsePenetrationThreshold = (float)splitImpulsePenetrationThresholdBox->value();
  171. this->designer->simulator->dynamicsWorld->getSolverInfo().m_linearSlop = (float)linearSlopBox->value();
  172. this->designer->simulator->dynamicsWorld->getSolverInfo().m_warmstartingFactor = (float)warmstartingFactorBox->value();
  173. // this->designer->simulator->dynamicsWorld->getSolverInfo().m_solverMode = (float)solverModeBox->value();
  174. this->designer->simulator->dynamicsWorld->getSolverInfo().m_restingContactRestitutionThreshold = (float)restingContactRestitutionThresholdBox->value();
  175. this->designer->simulator->dynamicsWorld->getSolverInfo().m_minimumSolverBatchSize = (float)minimumSolverBatchSizeBox->value();
  176. done(Accepted);
  177. }