@@ -19,7 +19,11 @@ SceneCloth::SceneCloth()
19
19
: clothVao(0 ), numElements(0 ),
20
20
nParticles(40 , 40 ), clothSize(4 .0f , 3 .0f ),
21
21
time(0 .0f ), deltaT(0 .0f ), speed(200 .0f ), readBuf(0 ),
22
- wireframe(false ), wind(false ), windStrength(0.5 ), windDir(glm::vec3(0.2 , 0 , 0.6 ))
22
+ lightDir(glm::vec3(0 )), lightColor(glm::vec3(1 )),
23
+ specularity(0 .2f ), ambiant(0 .2f ), diffuse(0 .8f ), shininess(80 ),
24
+ wireframe(false ), gravity(glm::vec3(0 , -10 , 0 )),
25
+ particleMass(0.1 ), springK(2000 ), wind(false ),
26
+ windStrength(0.5 ), windDir(glm::vec3(0.2 , 0 , 0.6 ))
23
27
{
24
28
}
25
29
@@ -32,14 +36,8 @@ void SceneCloth::initScene()
32
36
initBuffers ();
33
37
34
38
projection = glm::perspective (glm::radians (50 .0f ), (float )width / height, 1 .0f , 100 .0f );
35
-
36
39
renderProg.use ();
37
- renderProg.setUniform (" LightPosition" , glm::vec4 (0 .0f , 0 .0f , 0 .0f , 1 .0f ));
38
- renderProg.setUniform (" LightIntensity" , glm::vec3 (1 .0f ));
39
- renderProg.setUniform (" Kd" , glm::vec3 (0 .8f ));
40
- renderProg.setUniform (" Ka" , glm::vec3 (0 .2f ));
41
- renderProg.setUniform (" Ks" , glm::vec3 (0 .2f ));
42
- renderProg.setUniform (" Shininess" , 80 .0f );
40
+ setLight ();
43
41
44
42
computeProg.use ();
45
43
float dx = clothSize.x / (nParticles.x - 1 );
@@ -174,10 +172,7 @@ void SceneCloth::render()
174
172
glPolygonMode ( GL_FRONT_AND_BACK, GL_FILL );
175
173
176
174
computeProg.use ();
177
-
178
- computeProg.setUniform (" HasWind" , static_cast <float >(wind));
179
- computeProg.setUniform (" WindStrength" , windStrength);
180
- computeProg.setUniform (" WindDir" , windDir);
175
+ setPhysics ();
181
176
182
177
for (int i = 0 ; i < 1000 ; i++) {
183
178
glDispatchCompute (nParticles.x / 10 , nParticles.y / 10 , 1 );
@@ -199,6 +194,7 @@ void SceneCloth::render()
199
194
// Now draw the scene
200
195
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
201
196
renderProg.use ();
197
+ setLight ();
202
198
203
199
renderProg.setTexture (" Tex" , clothTexture, 0 );
204
200
@@ -214,7 +210,6 @@ void SceneCloth::render()
214
210
}
215
211
216
212
void SceneCloth::setMatrices () {
217
- renderProg.use ();
218
213
glm::mat4 mv = view * model;
219
214
glm::mat3 norm = glm::mat3 (vec3 (mv[0 ]), vec3 (mv[1 ]), vec3 (mv[2 ]));
220
215
@@ -223,23 +218,62 @@ void SceneCloth::setMatrices() {
223
218
renderProg.setUniform (" MVP" , projection * mv);
224
219
}
225
220
221
+ void SceneCloth::setLight ()
222
+ {
223
+ renderProg.setUniform (" LightPosition" , glm::vec4 (lightDir, 1 .0f ));
224
+ renderProg.setUniform (" LightIntensity" , lightColor);
225
+ renderProg.setUniform (" Kd" , glm::vec3 (diffuse));
226
+ renderProg.setUniform (" Ka" , glm::vec3 (ambiant));
227
+ renderProg.setUniform (" Ks" , glm::vec3 (specularity));
228
+ renderProg.setUniform (" Shininess" , shininess);
229
+ }
230
+
231
+ void SceneCloth::setPhysics ()
232
+ {
233
+ computeProg.setUniform (" Gravity" , gravity);
234
+ computeProg.setUniform (" ParticleMass" , particleMass);
235
+ computeProg.setUniform (" SpringK" , springK);
236
+
237
+ computeProg.setUniform (" HasWind" , static_cast <float >(wind));
238
+ computeProg.setUniform (" WindStrength" , windStrength);
239
+ computeProg.setUniform (" WindDir" , windDir);
240
+ }
241
+
226
242
void SceneCloth::resize (int w, int h)
227
243
{
228
244
glViewport (0 , 0 , w, h);
229
245
width = w;
230
246
height = h;
247
+ projection = glm::perspective (glm::radians (50 .0f ), (float )width / height, 1 .0f , 100 .0f );
231
248
}
232
249
233
250
void SceneCloth::uiUpdate ()
234
251
{
235
252
ImGui::Begin (" GUI" );
236
253
ImGui::Text (" Application average %.3f ms/frame (%.1f FPS)" , 1000 .0f / ImGui::GetIO ().Framerate , ImGui::GetIO ().Framerate );
237
254
ImGui::Checkbox (" Wireframe" , &wireframe);
255
+ if (ImGui::CollapsingHeader (" Particles" , ImGuiTreeNodeFlags_DefaultOpen))
256
+ {
257
+ ImGui::SliderFloat3 (" Gravity" , &gravity[0 ], -20 .0f , 20 .0f );
258
+ ImGui::SliderFloat (" ParticleMass" , &particleMass, 0 .1f , 0 .5f );
259
+ ImGui::SliderFloat (" SpringK" , &springK, 500 .0f , 5000 .0f );
260
+ }
261
+
238
262
if (ImGui::CollapsingHeader (" Wind" , ImGuiTreeNodeFlags_DefaultOpen))
239
263
{
240
264
ImGui::Checkbox (" Enable" , &wind);
241
265
ImGui::SliderFloat (" Strength" , &windStrength, 0 .0f , 10 .0f );
242
- ImGui::SliderFloat3 (" Direction" , &windDir[0 ], 0 .0f , 1 .0f );
266
+ ImGui::SliderFloat3 (" Wind Direction" , &windDir[0 ], -1 .0f , 1 .0f );
267
+ }
268
+
269
+ if (ImGui::CollapsingHeader (" Light" , ImGuiTreeNodeFlags_DefaultOpen))
270
+ {
271
+ ImGui::SliderFloat3 (" Light Direction" , &lightDir[0 ], 0 .0f , 1 .0f );
272
+ ImGui::ColorPicker3 (" Color" , &lightColor[0 ]);
273
+ ImGui::SliderFloat (" Ambiant" , &ambiant, 0 .0f , 1 .0f );
274
+ ImGui::SliderFloat (" Diffuse" , &diffuse, 0 .0f , 1 .0f );
275
+ ImGui::SliderFloat (" Specular" , &specularity, 0 .0f , 1 .0f );
276
+ ImGui::SliderFloat (" Shininess" , &shininess, 0 .0f , 200 .0f );
243
277
}
244
278
245
279
ImGui::End ();
0 commit comments