X-Git-Url: https://git.lukelau.me/?p=clouds.git;a=blobdiff_plain;f=clouds.cpp;fp=clouds.cpp;h=e406f5c6b7500aa06d1c055a819834a43c677ae4;hp=96612e8f1db71c7eef35b9d298ccc46e0bfc3caa;hb=c80f817e984fbabbadef14fc11bf0fa7385bc89b;hpb=31f19438c73b207f506ba0b1187d2de75c166a5b diff --git a/clouds.cpp b/clouds.cpp index 96612e8..e406f5c 100644 --- a/clouds.cpp +++ b/clouds.cpp @@ -1,4 +1,5 @@ #include "debug.hpp" +#include "simulation.h" #include "program.hpp" #include #include @@ -14,12 +15,6 @@ using namespace std; using namespace glm; -static const int CLOUD_DIM = 16; -struct Clouds { - char cld[CLOUD_DIM][CLOUD_DIM][CLOUD_DIM]; - float contDist[CLOUD_DIM][CLOUD_DIM][CLOUD_DIM]; -}; - // calculate continuous distribution void calcContDist(Clouds *clds); @@ -75,8 +70,6 @@ vector bbColors; GLuint bbProg; GLuint bbVao; -void calculateMetaballs() {} - // Here we need to generate n_q textures for different densities of metaballs // These textures then go on the billboards // The texture stores attenuation ratio? @@ -91,7 +84,7 @@ void precalculateBillboardTextures() { // TODO: properly calculate this instead of whatever this is for (int j = 0; j < 32; j++) for (int i = 0; i < 32; i++) - data[i + j * 32] = fmin(1.f, 0.3f + 2.f * (distance(vec2(i, j), vec2(16, 16)) / 16)); + data[i + j * 32] = fmin(1.f, 0.5f + 1.f * (distance(vec2(i, j), vec2(16, 16)) / 16)); glGenTextures(NQ, bbTexIds); @@ -116,6 +109,32 @@ struct Metaball { vector metaballs = {{{0, 0, 0.5}, 1.f}, {{0, 0.3, 0.3}, 0.7f}}; +Clouds cs; + +void calculateMetaballs() { + stepClouds(&cs); + metaballs.clear(); + for (int i = 0; i < CLOUD_DIM; i++) { + for (int j = 0; j < CLOUD_DIM; j++) { + for (int k = 0; k < CLOUD_DIM; k++) { + if (cs.cld[i][j][k]) { + /* float x = (float)rand()/(float)(RAND_MAX); */ + /* float y = (float)rand()/(float)(RAND_MAX); */ + /* float z = (float)rand()/(float)(RAND_MAX); */ + /* float r = (float)rand()/(float)(RAND_MAX); */ + /* Metaball m = {{x,y, 0.3 + z * 0.5}, r}; */ + /* metaballs.push_back(m); */ + Metaball m = {{i / (float)CLOUD_DIM, j / (float)CLOUD_DIM, k / (float)CLOUD_DIM}, + 1.f / (float)CLOUD_DIM }; + m.pos = (m.pos * vec3(2)) - vec3(1); + metaballs.push_back(m); + } + } + } + } + fprintf(stderr, "num metaballs: %lu\n", metaballs.size()); +} + vec3 sunPos = {0, 2, 2}, viewPos = {0, 0, 0}, lookPos = {0, 0, 1}; mat4 proj; // projection matrix mat4 view; // view matrix @@ -198,6 +217,8 @@ void shadeClouds() { * vec2(width, height); vec4 pixel; glReadPixels(screenPos.x, screenPos.y, 1, 1, GL_RGBA, GL_FLOAT, value_ptr(pixel)); + /* fprintf(stderr, "pixel:"); */ + /* dump(pixel); */ // Multiply the pixel value by the sunlight color. vec4 sunColor = {1, 1, 0.9, 1}; @@ -236,8 +257,11 @@ void renderClouds() { glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); // Set the billboard color as C[n]. - fprintf(stderr, "bbColors[i]: "); - dump(bbColors[i]); + /* fprintf(stderr, "bbColors[i]: "); */ + /* dump(bbColors[i]); */ + /* bbColors[i].x = 1 - bbColors[i].x; */ + /* bbColors[i].y = 1 - bbColors[i].y; */ + /* bbColors[i].z = 1 - bbColors[i].z; */ bbColors[i].w = 1; glUniform4fv(glGetUniformLocation(bbProg, "color"), 1, glm::value_ptr(bbColors[i])); @@ -276,6 +300,19 @@ void display() { glutSwapBuffers(); } +void timer(int _) { + /* calculateMetaballs(); */ + /* glutPostRedisplay(); */ + /* glutTimerFunc(16, timer, 0); */ +} + +void keyboard(unsigned char key, int x, int y) { + if (key == ' ') { + calculateMetaballs(); + glutPostRedisplay(); + } +} + int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB | @@ -314,11 +351,13 @@ int main(int argc, char **argv) { precalculateBillboardTextures(); + initClouds(&cs); calculateMetaballs(); glGenTextures(1, &attenuationTex); - /* glutTimerFunc(16, timer, 0); */ + glutKeyboardFunc(keyboard); + glutTimerFunc(16, timer, 0); // set up billboard prog