PeriDyno 1.2.1
Loading...
Searching...
No Matches
WSampleWidget.cpp
Go to the documentation of this file.
1#include "WSampleWidget.h"
2
3#include <Wt/WCssDecorationStyle.h>
4#include <Wt/WGridLayout.h>
5#include <Wt/WImage.h>
6#include <Wt/WLabel.h>
7#include <Wt/WVBoxLayout.h>
8
9#include <Platform.h>
10
11#define DECLARE_PERIDYNO_SAMPLE(NAME) \
12 class NAME : public Sample { \
13 public:\
14 std::string name() const {return #NAME;};\
15 std::string thumbnail() const {return std::string("samples/") + #NAME + ".jpg";};\
16 std::string source() const {return getAssetPath() + std::string("python_web_sample/") + #NAME + ".py";};\
17 };
18
19// CodimensionalPD
20class CPD_ClothDrop : public Sample {
21public: std::string name() const {
22 return "CPD_ClothDrop";
23}; std::string thumbnail() const {
24 return std::string("samples/") + "CPD_ClothDrop" + ".jpg";
25}; std::string source() const {
26 return getAssetPath() + std::string("python_web_sample/") + "CPD_ClothDrop" + ".py";
27};
28};
29DECLARE_PERIDYNO_SAMPLE(CPD_ClothOnTable)
30DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_1)
31DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_3)
32DECLARE_PERIDYNO_SAMPLE(CPD_ClothOverBall_6)
33DECLARE_PERIDYNO_SAMPLE(CPD_RealTimeCloth_v1)
34DECLARE_PERIDYNO_SAMPLE(CPD_RealTimeCloth_v2)
35DECLARE_PERIDYNO_SAMPLE(CPD_RotateCylinder)
36//DECLARE_PERIDYNO_SAMPLE(CPD_ShootingCloth)
37DECLARE_PERIDYNO_SAMPLE(GL_ClothWithCollision)
38
39// DualParticle
40DECLARE_PERIDYNO_SAMPLE(DualParticle_4Box)
41DECLARE_PERIDYNO_SAMPLE(DualParticle_CollidingFish)
42DECLARE_PERIDYNO_SAMPLE(DualParticle_Fountain)
43DECLARE_PERIDYNO_SAMPLE(DualParticle_Jets)
44DECLARE_PERIDYNO_SAMPLE(Qt_DualParticle_FishAndBall)
45
46// HeightField
47DECLARE_PERIDYNO_SAMPLE(GL_CapillaryWave)
48DECLARE_PERIDYNO_SAMPLE(GL_GranularMedia)
50DECLARE_PERIDYNO_SAMPLE(GL_OceanPatch)
51DECLARE_PERIDYNO_SAMPLE(GL_RigidSandCoupling)
53DECLARE_PERIDYNO_SAMPLE(Qt_Buoyancy)
54DECLARE_PERIDYNO_SAMPLE(Qt_LargeOcean)
55
56// Modeling
58DECLARE_PERIDYNO_SAMPLE(Qt_GUI_ProcedureModeling)
59//DECLARE_PERIDYNO_SAMPLE(Qt_Jeep)
60DECLARE_PERIDYNO_SAMPLE(Qt_JeepLandscape)
61//DECLARE_PERIDYNO_SAMPLE(Qt_PointSampling)
62DECLARE_PERIDYNO_SAMPLE(Qt_PolyEdit)
63
64// Peridynamics
65//DECLARE_PERIDYNO_SAMPLE(GL_BrittleFracture)
67DECLARE_PERIDYNO_SAMPLE(GL_Elasticity)
68DECLARE_PERIDYNO_SAMPLE(GL_Plasticity)
69
70// RigidBody
71DECLARE_PERIDYNO_SAMPLE(GL_BoxStack)
73//DECLARE_PERIDYNO_SAMPLE(GL_CollisionDetectionIn3D)
74DECLARE_PERIDYNO_SAMPLE(GL_CollisionMask)
75DECLARE_PERIDYNO_SAMPLE(GL_FixedJoint)
76//DECLARE_PERIDYNO_SAMPLE(GL_HingeChain)
77DECLARE_PERIDYNO_SAMPLE(GL_HingeJoint)
78//DECLARE_PERIDYNO_SAMPLE(GL_HingeRing)
79//DECLARE_PERIDYNO_SAMPLE(GL_Overlap)
80//DECLARE_PERIDYNO_SAMPLE(GL_Pyramid)
81//DECLARE_PERIDYNO_SAMPLE(GL_RigidCompound)
82DECLARE_PERIDYNO_SAMPLE(GL_SliderJoint)
83DECLARE_PERIDYNO_SAMPLE(GL_TestAttribute)
85DECLARE_PERIDYNO_SAMPLE(Qt_BallAndSocketJoint)
87//DECLARE_PERIDYNO_SAMPLE(Qt_Multibody)
88DECLARE_PERIDYNO_SAMPLE(Qt_PresetArticulatedBody)
89DECLARE_PERIDYNO_SAMPLE(Qt_TrackedTank)
90
91// SemiAnalytical
92DECLARE_PERIDYNO_SAMPLE(GL_Semi_Barricade)
93DECLARE_PERIDYNO_SAMPLE(Qt_WaterPouring)
94
95// SPH
96//DECLARE_PERIDYNO_SAMPLE(GL_Comparison)
97//DECLARE_PERIDYNO_SAMPLE(GL_GhostSPH)
98DECLARE_PERIDYNO_SAMPLE(GL_ParticleEmitter)
99DECLARE_PERIDYNO_SAMPLE(GL_ParticleFluid)
100DECLARE_PERIDYNO_SAMPLE(GL_ViscosityFish)
101//DECLARE_PERIDYNO_SAMPLE(QT_GhostSPH)
102DECLARE_PERIDYNO_SAMPLE(Qt_ParticleSkinning)
103
104// Tutorials
105DECLARE_PERIDYNO_SAMPLE(GL_GlfwGUI)
106DECLARE_PERIDYNO_SAMPLE(GL_PhotorealisticRender)
107
108// Volume
109DECLARE_PERIDYNO_SAMPLE(GL_MarchingCubes)
110DECLARE_PERIDYNO_SAMPLE(GL_SDFUniform)
111
113{
114private:
116 {
117 // CodimensionalPD
118 //samples.push_back(new CPD_ClothDrop);
119 samples.push_back(new CPD_ClothOnTable);
120 samples.push_back(new CPD_ClothOverBall_1);
121 samples.push_back(new CPD_ClothOverBall_3);
122 samples.push_back(new CPD_ClothOverBall_6);
123 samples.push_back(new CPD_RealTimeCloth_v1);
124 //samples.push_back(new CPD_RealTimeCloth_v2);
125 //samples.push_back(new CPD_RotateCylinder);
126 //samples.push_back(new CPD_ShootingCloth);
127 samples.push_back(new GL_ClothWithCollision);
128
129 // DualParticle
130 samples.push_back(new DualParticle_4Box);
131 samples.push_back(new DualParticle_CollidingFish);
132 samples.push_back(new DualParticle_Fountain);
133 samples.push_back(new DualParticle_Jets);
134 samples.push_back(new Qt_DualParticle_FishAndBall);
135
136 // HeightField
137 samples.push_back(new GL_CapillaryWave);
138 //samples.push_back(new GL_GranularMedia);
139 samples.push_back(new GL_Ocean);
140 samples.push_back(new GL_OceanPatch);
141 samples.push_back(new GL_RigidSandCoupling);
142 samples.push_back(new GL_Terrain);
143 samples.push_back(new Qt_Buoyancy);
144 samples.push_back(new Qt_LargeOcean);
145
146 // Modeling
147 samples.push_back(new Qt_GLTF);
148 samples.push_back(new Qt_GUI_ProcedureModeling);
149 //samples.push_back(new Qt_Jeep);
150 samples.push_back(new Qt_JeepLandscape);
151 //samples.push_back(new Qt_PointSampling);
152 samples.push_back(new Qt_PolyEdit);
153
154 // Peridynamics
155 //samples.push_back(new GL_BrittleFracture);
156 samples.push_back(new GL_Cloth);
157 samples.push_back(new GL_Elasticity);
158 samples.push_back(new GL_Plasticity);
159
160 // RigidBody
161 samples.push_back(new GL_BoxStack);
162 samples.push_back(new GL_Bricks);
163 //samples.push_back(new GL_CollisionDetectionIn3D);
164 samples.push_back(new GL_CollisionMask);
165 samples.push_back(new GL_FixedJoint);
166 //samples.push_back(new GL_HingeChain);
167 samples.push_back(new GL_HingeJoint);
168 //samples.push_back(new GL_HingeRing);
169 //samples.push_back(new GL_Overlap);
170 //samples.push_back(new GL_Pyramid);
171 //samples.push_back(new GL_RigidCompound);
172 samples.push_back(new GL_SliderJoint);
173 samples.push_back(new GL_TestAttribute);
174 samples.push_back(new GL_Timing);
175 samples.push_back(new Qt_BallAndSocketJoint);
176 samples.push_back(new Qt_Gear);
177 //samples.push_back(new Qt_Multibody);
178 samples.push_back(new Qt_PresetArticulatedBody);
179 samples.push_back(new Qt_TrackedTank);
180
181 // SemiAnalytical
182 samples.push_back(new GL_Semi_Barricade);
183 samples.push_back(new Qt_WaterPouring);
184
185 // SPH
186 //samples.push_back(new GL_Comparison);
187 //samples.push_back(new GL_GhostSPH);
188 samples.push_back(new GL_ParticleEmitter);
189 samples.push_back(new GL_ParticleFluid);
190 samples.push_back(new GL_ViscosityFish);
191 //samples.push_back(new QT_GhostSPH);
192 samples.push_back(new Qt_ParticleSkinning);
193
194 // Tutorials
195 samples.push_back(new GL_GlfwGUI);
196 samples.push_back(new GL_PhotorealisticRender);
197
198 // Volume
199 samples.push_back(new GL_MarchingCubes);
200 samples.push_back(new GL_SDFUniform);
201 }
202
203public:
205 {
206 static SampleStore* instance = new SampleStore;
207 return instance;
208 }
209
210 std::vector<Sample*>& getSamples()
211 {
212 return samples;
213 }
214
216 {
217 return samples[idx];
218 }
219
220 void addSample(Sample* sample)
221 {
222 samples.push_back(sample);
223 }
224
225private:
226 std::vector<Sample*> samples;
227};
228
229Wt::WContainerWidget* _createItem(Sample* sample)
230{
231 Wt::WContainerWidget* container = new Wt::WContainerWidget;
232 auto layout = container->setLayout(std::make_unique<Wt::WVBoxLayout>());
233
234 // image
235 auto image = layout->addWidget(std::make_unique<Wt::WImage>(sample->thumbnail()), 0, Wt::AlignmentFlag::Center);
236 image->resize(120, 120);
237 // label
238 auto label = layout->addWidget(std::make_unique<Wt::WLabel>(sample->name()), 0, Wt::AlignmentFlag::Center);
239 // description as tooltip
240 container->setToolTip(sample->description());
241
242 Wt::WCssDecorationStyle style0 = container->decorationStyle();
243 Wt::WCssDecorationStyle style1 = container->decorationStyle();
244 style0.setBackgroundColor(Wt::WColor(200, 200, 200));
245 style0.setForegroundColor(Wt::WColor(50, 50, 50));
246
247 container->setStyleClass("sample-item");
248 image->setStyleClass("sample-item");
249
250 container->mouseWentOver().connect([=]() {
251 container->setDecorationStyle(style0);
252 });
253
254 container->mouseWentOut().connect([=]() {
255 container->setDecorationStyle(style1);
256 });
257
258 return container;
259}
260
262{
263 //this->setHeight(Wt::WLength("100%"));
264 //this->setOverflow(Wt::Overflow::Auto);
265
266 auto container = std::make_unique<Wt::WContainerWidget>();
267 auto gridLayout = std::make_unique<Wt::WGridLayout>();
268
269 int row = 0;
270 int col = 0;
271
272
273 for (auto sample : SampleStore::getInstance()->getSamples())
274 {
275 auto item = _createItem(sample);
276 gridLayout->addWidget(std::unique_ptr<Wt::WContainerWidget>(item), row, col);
277
278 item->clicked().connect([=]()
279 {
280 m_signal.emit(sample);
281 });
282
283 col++;
284 if (col == maxColumns)
285 {
286 col = 0;
287 row++;
288 }
289 }
290 container->setLayout(std::move(gridLayout));
291 this->addWidget(std::move(container));
292}
293
294Wt::Signal<Sample*>& WSampleWidget::clicked()
295{
296 return m_signal;
297}
Wt::WContainerWidget * _createItem(Sample *sample)
#define DECLARE_PERIDYNO_SAMPLE(NAME)
std::string thumbnail() const
std::string name() const
std::string source() const
virtual std::string description() const
virtual std::string name() const =0
virtual std::string thumbnail() const
Sample * getSample(int idx)
std::vector< Sample * > & getSamples()
static SampleStore * getInstance()
std::vector< Sample * > samples
void addSample(Sample *sample)
Wt::Signal< Sample * > & clicked()
WSampleWidget(int maxColumns)
Wt::Signal< Sample * > m_signal