PeriDyno 1.2.1
Loading...
Searching...
No Matches
WRenderParamsWidget.cpp
Go to the documentation of this file.
2
3#include <Wt/WBorderLayout.h>
4#include <Wt/WCheckBox.h>
5#include <Wt/WColorPicker.h>
6#include <Wt/WDoubleSpinBox.h>
7#include <Wt/WPanel.h>
8#include <Wt/WPushButton.h>
9#include <Wt/WSlider.h>
10#include <Wt/WTable.h>
11#include <Wt/WText.h>
12
13#include <GLRenderEngine.h>
14
15using namespace dyno;
16
18{
19 this->setLayoutSizeAware(true);
20 this->setOverflow(Wt::Overflow::Auto);
21 this->setHeight(Wt::WLength("100%"));
22
24 //createCameraPanel();
26
27 mRenderParams = rparams;
28 update();
29
30 // connect signal
31 mAmbientColor->colorInput().connect(this, &WRenderParamsWidget::updateRenderParams);
32 mAmbientScale->valueChanged().connect(this, &WRenderParamsWidget::updateRenderParams);
33 mLightColor->colorInput().connect(this, &WRenderParamsWidget::updateRenderParams);
34 mLightScale->valueChanged().connect(this, &WRenderParamsWidget::updateRenderParams);
35 mLightTheta->valueChanged().connect(this, &WRenderParamsWidget::updateRenderParams);
36 mLightPhi->valueChanged().connect(this, &WRenderParamsWidget::updateRenderParams);
37
38 //mCameraEyeX->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
39 //mCameraEyeY->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
40 //mCameraEyeZ->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
41 //mCameraTargetX->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
42 //mCameraTargetY->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
43 //mCameraTargetZ->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
44 //mCameraUpX->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
45 //mCameraUpY->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
46 //mCameraUpZ->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
47 //mCameraFov->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
48 //mCameraAspect->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
49 //mCameraClipNear->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
50 //mCameraClipFar->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
51
53 //mAxisHelper->changed().connect(this, &WRenderParamsWidget::updateRenderParams);
55 mGroundScale->valueChanged().connect(this, &WRenderParamsWidget::updateRenderParams);
58}
59
60template<class T>
61T* addTableRow(Wt::WTable* table, std::string label, int labelWidth = 120, int widgetWidth = 120)
62{
63 int row = table->rowCount();
64 auto cell0 = table->elementAt(row, 0);
65 auto cell1 = table->elementAt(row, 1);
66
67 cell0->addNew<Wt::WText>(label);
68 cell0->setContentAlignment(Wt::AlignmentFlag::Middle);
69 cell0->setWidth(labelWidth);
70
71 cell1->setContentAlignment(Wt::AlignmentFlag::Middle);
72 cell1->setWidth(widgetWidth);
73
74 T* widget = cell1->addNew<T>();
75 widget->setWidth(widgetWidth);
76 return widget;
77}
78
80{
81 // ambient light
82 {
83 auto panel = this->addNew<Wt::WPanel>();
84 panel->setCollapsible(true);
85 panel->setTitle("Ambient Light");
86 auto table = panel->setCentralWidget(std::make_unique<Wt::WTable>());
87 table->setMargin(10);
88
89 // ambient light
90 mAmbientColor = addTableRow<Wt::WColorPicker>(table, "Ambient Color");
91 mAmbientScale = addTableRow<Wt::WDoubleSpinBox>(table, "Ambient Scale");
92 mAmbientScale->setRange(1, 100);
93 }
94
95 // main directional light
96 {
97 auto panel = this->addNew<Wt::WPanel>();
98 panel->setCollapsible(true);
99 panel->setTitle("Main Directional Light");
100 auto table = panel->setCentralWidget(std::make_unique<Wt::WTable>());
101 table->setMargin(10);
102
103 mLightColor = addTableRow<Wt::WColorPicker>(table, "Light Color");
104 mLightScale = addTableRow<Wt::WDoubleSpinBox>(table, "Light Scale");
105 mLightScale->setRange(1, 100);
106
107 mLightTheta = addTableRow<Wt::WSlider>(table, "Light Theta");
108 mLightPhi = addTableRow<Wt::WSlider>(table, "Light Phi");
109 mLightTheta->setRange(0, 180);
110 mLightPhi->setRange(-180, 180);
111 }
112
113 mAmbientColor->setStyleClass("color-picker");
114 mLightColor->setStyleClass("color-picker");
115
116}
117
119{
120 // light
121 auto panel = this->addNew<Wt::WPanel>();
122 panel->setCollapsible(true);
123 panel->setTitle("Camera Settings");
124 auto table = panel->setCentralWidget(std::make_unique<Wt::WTable>());
125 table->setMargin(10);
126
130
134
138
139 mCameraFov = addTableRow<Wt::WDoubleSpinBox>(table, "FOV(Vertical)");
143
144 table->elementAt(13, 0)->setColumnSpan(2);
145 table->elementAt(13, 0)->setContentAlignment(Wt::AlignmentFlag::Center);
146 auto updateBtn = table->elementAt(13, 0)->addNew<Wt::WPushButton>("Update from Canvas");
147 updateBtn->setMargin(10, Wt::Side::Top);
148 updateBtn->clicked().connect(this, &WRenderParamsWidget::update);
149
150 // aspect is auto computed from framebuffer sizer
151 mCameraAspect->setEnabled(false);
152
153}
154
155
157{
158 auto panel = this->addNew<Wt::WPanel>();
159 panel->setCollapsible(true);
160 panel->setTitle("Render Settings");
161 auto table = panel->setCentralWidget(std::make_unique<Wt::WTable>());
162 table->setMargin(10);
163
164 mSceneBounds = addTableRow<Wt::WCheckBox>(table, "Scene Bound");
165 //mAxisHelper = addTableRow<Wt::WCheckBox>(table, "Axis Helper");
166 mGroundPlane = addTableRow<Wt::WCheckBox>(table, "Ground Plane");
167 mGroundScale = addTableRow<Wt::WSlider>(table, "Ground Scale");
168 mGroundScale->setRange(1, 52);
169 mBackgroudColor0 = addTableRow<Wt::WColorPicker>(table, "Background");
170 mBackgroudColor0->setStyleClass("color-picker");
171 mBackgroudColor1 = addTableRow<Wt::WColorPicker>(table, "Background");
172 mBackgroudColor1->setStyleClass("color-picker");
173
174}
175
176Wt::WColor Glm2WColor(glm::vec3 v)
177{
178 return Wt::WColor(v.x * 255, v.y * 255, v.z * 255);
179}
180
181glm::vec3 WColor2Glm(Wt::WColor clr)
182{
183 return { clr.red() / 255.f, clr.green() / 255.f, clr.blue() / 255.f };
184}
185
186glm::vec3 xyz2sphere(glm::vec3 v)
187{
188 float xz = glm::length(glm::vec2(v.x, v.z));
189 float theta = atan2(xz, v.y);
190 float phi = atan2(v.z, v.x);
191 return glm::vec3(theta, phi, glm::length(v));
192}
193
194glm::vec3 sphere2xyz(glm::vec3 v)
195{
196 float r = v.z;
197 float x = r * sinf(v.x) * cosf(v.y);
198 float y = r * cosf(v.x);
199 float z = r * sinf(v.x) * sinf(v.y);
200 return glm::vec3(x, y, z);
201}
202
204{
205 // light
206 mAmbientColor->setColor(Glm2WColor(mRenderParams->light.ambientColor));
207 mAmbientScale->setValue(mRenderParams->light.ambientScale);
208 mLightColor->setColor(Glm2WColor(mRenderParams->light.mainLightColor));
209 mLightScale->setValue(mRenderParams->light.mainLightScale);
210 //
211 glm::vec3 dir = glm::normalize(mRenderParams->light.mainLightDirection);
212 glm::vec3 polar = xyz2sphere(dir);
213 mLightTheta->setValue(glm::degrees(polar.x));
214 mLightPhi->setValue(glm::degrees(polar.y));
215
216 //TODO:
217 // camera
218// mCameraEyeX->setValue(mRenderParams->camera.eye.x);
219// mCameraEyeY->setValue(mRenderParams->camera.eye.y);
220// mCameraEyeZ->setValue(mRenderParams->camera.eye.z);
221// mCameraTargetX->setValue(mRenderParams->camera.target.x);
222// mCameraTargetY->setValue(mRenderParams->camera.target.y);
223// mCameraTargetZ->setValue(mRenderParams->camera.target.z);
224// mCameraUpX->setValue(mRenderParams->camera.up.x);
225// mCameraUpY->setValue(mRenderParams->camera.up.y);
226// mCameraUpZ->setValue(mRenderParams->camera.up.z);
227// mCameraFov->setValue(mRenderParams->camera.y_fov);
228// mCameraAspect->setValue(mRenderParams->camera.aspect);
229// mCameraClipNear->setValue(mRenderParams->camera.z_min);
230// mCameraClipFar->setValue(mRenderParams->camera.z_max);
231
232 // render
233// mSceneBounds->setChecked(mRenderParams->showSceneBounds);
234// //mAxisHelper->setChecked(mRenderParams->showAxisHelper);
235// mGroundPlane->setChecked(mRenderParams->showGround);
236// mGroundScale->setValue(mRenderParams->planeScale);
237// mBackgroudColor0->setColor(Glm2WColor(mRenderParams->bgColor0));
238// mBackgroudColor1->setColor(Glm2WColor(mRenderParams->bgColor1));
239}
240
242{
243 mRenderParams->light.ambientColor = WColor2Glm(mAmbientColor->color());
244 mRenderParams->light.ambientScale = mAmbientScale->value();
245
246 mRenderParams->light.mainLightColor = WColor2Glm(mLightColor->color());
247 mRenderParams->light.mainLightScale = mLightScale->value();
248
249 glm::vec2 polar = glm::radians(glm::vec2(mLightTheta->value(), mLightPhi->value()));
250 mRenderParams->light.mainLightDirection = sphere2xyz(glm::vec3(polar, 1));
251
252 // mRenderParams->camera.eye.x = mCameraEyeX->value();
253 // mRenderParams->camera.eye.y = mCameraEyeY->value();
254 // mRenderParams->camera.eye.z = mCameraEyeZ->value();
255 //
256 // mRenderParams->camera.target.x = mCameraTargetX->value();
257 // mRenderParams->camera.target.y = mCameraTargetY->value();
258 // mRenderParams->camera.target.z = mCameraTargetZ->value();
259 //
260 // mRenderParams->camera.up.x = mCameraUpX->value();
261 // mRenderParams->camera.up.y = mCameraUpY->value();
262 // mRenderParams->camera.up.z = mCameraUpZ->value();
263 //
264 // mRenderParams->camera.y_fov = mCameraFov->value();
265 // //mRenderParams->camera.aspect = mCameraAspect->value();
266 // mRenderParams->camera.z_min = mCameraClipNear->value();
267 // mRenderParams->camera.z_max = mCameraClipFar->value();
268 //
269 // mRenderParams->showSceneBounds = mSceneBounds->isChecked();
270 // //mRenderParams->showAxisHelper = mAxisHelper->isChecked();
271 // mRenderParams->showGround = mGroundPlane->isChecked();
272 // mRenderParams->planeScale = mGroundScale->value();
273 // mRenderParams->bgColor0 = WColor2Glm(mBackgroudColor0->color());
274 // mRenderParams->bgColor1 = WColor2Glm(mBackgroudColor1->color());
275
276 mSignal.emit();
277}
T * addTableRow(Wt::WTable *table, std::string label, int labelWidth=120, int widgetWidth=120)
Wt::WColor Glm2WColor(glm::vec3 v)
glm::vec3 xyz2sphere(glm::vec3 v)
glm::vec3 WColor2Glm(Wt::WColor clr)
glm::vec3 sphere2xyz(glm::vec3 v)
Wt::WDoubleSpinBox * mCameraEyeZ
Wt::WDoubleSpinBox * mCameraEyeX
Wt::WColorPicker * mBackgroudColor1
Wt::WColorPicker * mBackgroudColor0
Wt::WDoubleSpinBox * mCameraUpZ
Wt::WDoubleSpinBox * mCameraClipNear
WRenderParamsWidget(dyno::RenderParams *rparams)
Wt::WColorPicker * mAmbientColor
dyno::RenderParams * mRenderParams
Wt::WDoubleSpinBox * mCameraTargetY
Wt::WDoubleSpinBox * mAmbientScale
Wt::WDoubleSpinBox * mCameraTargetX
Wt::WDoubleSpinBox * mCameraUpY
Wt::WCheckBox * mGroundPlane
Wt::WDoubleSpinBox * mCameraAspect
Wt::WDoubleSpinBox * mCameraFov
Wt::WCheckBox * mSceneBounds
Wt::WDoubleSpinBox * mCameraTargetZ
Wt::WDoubleSpinBox * mCameraUpX
Wt::WDoubleSpinBox * mCameraClipFar
Wt::WDoubleSpinBox * mLightScale
Wt::WDoubleSpinBox * mCameraEyeY
Wt::WColorPicker * mLightColor
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
DYN_FUNC Complex< Real > polar(const Real &__rho, const Real &__theta=Real(0))
Definition Complex.inl:279