Some typo fixes
[clouds.git] / simulation.cpp
index 33b58de92c21f03d3e39a7310e33ad20a386dcc7..2268650cc4250f13be0386a6e0b1ca33b264aa81 100644 (file)
@@ -1,4 +1,4 @@
-#include "simulation.h"
+#include "simulation.hpp"
 #include <cstdlib>
 #include <glm/glm.hpp>
 
@@ -19,7 +19,7 @@ void initClouds(Clouds *cs) {
   for (int i = 0; i < CLOUD_DIM_X; i++) {
     for (int j = 0; j < CLOUD_DIM_Y; j++) {
       for (int k = 0; k < CLOUD_DIM_Z; k++) {
-        cs->act[i][j][k] = randf() < 0.01;
+        cs->act[i][j][k] = randf() < 0.005;
         cs->cld[i][j][k] = false;
         cs->hum[i][j][k] = randf() < 0.01;
         cs->p_ext[i][j][k] = 0.f;
@@ -29,17 +29,8 @@ void initClouds(Clouds *cs) {
     }
   }
 
-  for (int i = 0; i < CLOUD_DIM_X; i++) {
-    for (int j = 0; j < CLOUD_DIM_Y; j++) {
-      for (int k = 0; k < CLOUD_DIM_Z; 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);
-      }
-    }
-  }
-  for (int k = 0; k < CLOUD_DIM_Z; k++)
-    cs->vz[k] = floor(randf() * 3);
+  for (int k = 0; k < CLOUD_DIM_Y; k++)
+    cs->vy[k] = floor(randf() * 2);
 
   // generate ellipsoids of probability
   const int numEllipsoids = CLOUD_DIM_X * CLOUD_DIM_Y * CLOUD_DIM_Z * 0.001;
@@ -48,12 +39,15 @@ void initClouds(Clouds *cs) {
     float delta = maxSize - minSize;
     int width = minSize + randf() * delta, height = minSize + randf() * delta, depth = minSize + randf() * delta;
     int x = randf() * CLOUD_DIM_X, y = randf() * CLOUD_DIM_Y, z = randf() * CLOUD_DIM_Z;
-    glm::vec3 center(x + width / 2, y + height / 2, z + depth / 2);
 
+    const float maxDist = glm::distance(glm::vec3(0), glm::vec3(0.5,0.5,0.5));
     for (int i = x; i < x + width; i++) {
       for (int j = y; j < y + height; j++) {
         for (int k = z; k < z + depth; k++) {
-          float dist = glm::distance(glm::vec3(i,j,k), center) / maxSize;
+          // between [0,0,0] and [1,1,1]
+          glm::vec3 uniformPos = glm::vec3(i - x, j - y, k - z) / glm::vec3(width, height, depth);
+
+          float dist = glm::distance(uniformPos, glm::vec3(0.5,0.5,0.5)) / maxDist;
           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));
@@ -79,8 +73,11 @@ inline bool f_act(Clouds *cs, int i, int j, int k) {
     || get(cs->act, i, j - 2, k) || get(cs->act, i , j + 2, k) || get(cs->act, i, j, k - 2);
 }
 
+// scratch for updates on the heap
+Clouds ncs;
+
 void growth(Clouds *cs) {
-  Clouds ncs = *cs;
+  ncs = *cs;
 
   for (int i = 0; i < CLOUD_DIM_X; i++) {
     for (int j = 0; j < CLOUD_DIM_Y; j++) {
@@ -96,7 +93,7 @@ void growth(Clouds *cs) {
 }
 
 void extinction(Clouds *cs) {
-  Clouds ncs = *cs;
+  ncs = *cs;
   for (int i = 0; i < CLOUD_DIM_X; i++) {
     for (int j = 0; j < CLOUD_DIM_Y; j++) {
       for (int k = 0; k < CLOUD_DIM_Z; k++) {
@@ -110,12 +107,12 @@ void extinction(Clouds *cs) {
 }
 
 void advection(Clouds *cs) {
-  Clouds ncs = *cs;
+  ncs = *cs;
 
   for (int i = 0; i < CLOUD_DIM_X; i++) {
     for (int j = 0; j < CLOUD_DIM_Y; j++) {
       for (int k = 0; k < CLOUD_DIM_Z; k++) {
-        int v = cs->vz[k];
+        int v = cs->vy[j];
         ncs.hum[i][j][k] = i - v > 0 ? cs->hum[i - v][j][k] : 0;
         ncs.cld[i][j][k] = i - v > 0 ? cs->cld[i - v][j][k] : 0;
         ncs.act[i][j][k] = i - v > 0 ? cs->act[i - v][j][k] : 0;