X-Git-Url: https://git.lukelau.me/?p=clouds.git;a=blobdiff_plain;f=simulation.cpp;fp=simulation.cpp;h=2268650cc4250f13be0386a6e0b1ca33b264aa81;hp=33b58de92c21f03d3e39a7310e33ad20a386dcc7;hb=efac65ad1c51cdd7e8ecd37ebb9570ac14efeeeb;hpb=724a80cbecb587d1d069f7999758181b10d92f73 diff --git a/simulation.cpp b/simulation.cpp index 33b58de..2268650 100644 --- a/simulation.cpp +++ b/simulation.cpp @@ -1,4 +1,4 @@ -#include "simulation.h" +#include "simulation.hpp" #include #include @@ -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;