#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-bool debugContDist = false;
+enum Mode {
+ render,
+ debugContDist,
+ debugProbExt,
+ debugProbAct
+};
+Mode curMode = render;
using namespace std;
using namespace glm;
struct Metaball {
vec3 pos;
+ ivec3 coords;
/** Radius, density */
float r, d;
vec4 col;
for (int k = 0; k < CLOUD_DIM; k++) {
Metaball m = {
{i / (float)CLOUD_DIM, j / (float)CLOUD_DIM, k / (float)CLOUD_DIM},
+ {i, j, k},
1.f / (float)CLOUD_DIM};
m.pos = (m.pos * vec3(2)) - vec3(1);
m.d = cs.q[i][j][k];
return distance(camPos, a.pos) > distance(camPos, b.pos);
});
- glUniform1i(glGetUniformLocation(bbProg, "debugContDist"), debugContDist);
+ glUniform1i(glGetUniformLocation(bbProg, "debug"), curMode != render);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
// Don't modulate it -- blend it
glUniform1i(glGetUniformLocation(bbProg, "modulate"), 0);
- if (debugContDist) {
- glUniform1f(glGetUniformLocation(bbProg, "density"), k.d);
+ if (curMode != render) {
+ float debugVal = 0;
+ if (curMode == debugContDist) debugVal = k.d;
+ else if (curMode == debugProbAct) debugVal = cs.p_act[k.coords.x][k.coords.y][k.coords.z];
+ else if (curMode == debugProbExt) debugVal = cs.p_ext[k.coords.x][k.coords.y][k.coords.z];
+ glUniform1f(glGetUniformLocation(bbProg, "debugVal"), debugVal);
glDisable(GL_BLEND);
model = scale(model, vec3(0.02));
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
/* calculateMetaballs(); */
if (needsRedisplay) {
glutPostRedisplay();
- needsRedisplay = false;
}
+ needsRedisplay = false;
glutTimerFunc(16, timer, 0);
}
needsRedisplay = true;
needsReshading = true;
}
- if (key == 'd') {
- debugContDist = !debugContDist;
+ if (key == '0') {
+ curMode = render;
+ needsRedisplay = true;
+ }
+ if (key == '1') {
+ curMode = debugContDist;
+ needsRedisplay = true;
+ }
+ if (key == '2') {
+ curMode = debugProbAct;
+ needsRedisplay = true;
+ }
+ if (key == '3') {
+ curMode = debugProbExt;
needsRedisplay = true;
}
}
for (int i = 0; i < CLOUD_DIM; i++) {
for (int j = 0; j < CLOUD_DIM; j++) {
for (int k = 0; k < CLOUD_DIM; k++) {
- cs->act[i][j][k] = rand() % 8 == 0;
+ cs->act[i][j][k] = randf() < 0.01;
cs->cld[i][j][k] = false;
- cs->hum[i][j][k] = rand() % 9 == 0;
+ cs->hum[i][j][k] = randf() < 0.01;
cs->p_ext[i][j][k] = 0.f;
cs->p_hum[i][j][k] = 0.f;
cs->p_act[i][j][k] = 0.f;
}
}
+ for (int i = 0; i < CLOUD_DIM; i++) {
+ for (int j = 0; j < CLOUD_DIM; j++) {
+ for (int k = 0; k < CLOUD_DIM; k++) {
+ assert(cs->p_act[i][j][k] == 0.f);
+ assert(cs->p_ext[i][j][k] == 0.f);
+ assert(cs->p_hum[i][j][k] == 0.f);
+ }
+ }
+ }
+
// generate ellipsoids of probability
for (int n = 0; n < 6; n++) {
- const float maxSize = 5;
- int width = randf() * maxSize, height = randf() * maxSize, depth = randf() * maxSize;
+ const float maxSize = 8, minSize = 4;
+ float delta = maxSize - minSize;
+ int width = minSize + randf() * delta, height = minSize + randf() * delta, depth = minSize + randf() * delta;
int x = randf() * CLOUD_DIM, y = randf() * CLOUD_DIM, z = randf() * CLOUD_DIM;
glm::vec3 center(x + width / 2, y + height / 2, z + depth / 2);
for (int i = x; i < x + width; i++) {
for (int j = y; j < y + height; j++) {
for (int k = z; k < z + depth; k++) {
- set(cs->p_ext, x, y, z, P_EXT * glm::distance(glm::vec3(x,y,z), center) / maxSize);
- set(cs->p_hum, x, y, z, P_HUM * (1.f - glm::distance(glm::vec3(x,y,z), center) / maxSize));
- set(cs->p_act, x, y, z, P_ACT * (1.f - glm::distance(glm::vec3(x,y,z), center) / maxSize));
+ float dist = glm::distance(glm::vec3(i,j,k), center) / maxSize;
+ set(cs->p_ext, i, j, k, P_EXT * dist);
+ set(cs->p_hum, i, j, k, P_HUM * (1.f - dist));
+ set(cs->p_act, i, j, k, P_ACT * (1.f - dist));
}
}
}
}
void growth(Clouds *cs) {
- Clouds ncs;
+ Clouds ncs = *cs;
for (int i = 0; i < CLOUD_DIM; i++) {
for (int j = 0; j < CLOUD_DIM; j++) {
}
void extinction(Clouds *cs) {
- Clouds ncs;
+ Clouds ncs = *cs;
for (int i = 0; i < CLOUD_DIM; i++) {
for (int j = 0; j < CLOUD_DIM; j++) {
for (int k = 0; k < CLOUD_DIM; k++) {