void UiSettings::loadSettings() { QSettings s( "CS224", "snow" ); windowPosition() = s.value( "windowPosition", QPoint(0,0) ).toPoint(); windowSize() = s.value( "windowSize", QSize(1000,800) ).toSize(); fillNumParticles() = s.value( "fillNumParticles", 512*128 ).toInt(); fillResolution() = s.value( "fillResolution", 0.05f ).toFloat(); fillDensity() = s.value( "fillDensity", 150.f ).toFloat(); exportDensity() = s.value("exportDensity", false).toBool(); exportVelocity() = s.value("exportVelocity", false).toBool(); exportFPS() = s.value("exportFPS", 24).toInt(); maxTime() = s.value("maxTime", 3).toFloat(); gridPosition() = vec3( s.value("gridPositionX", 0.f).toFloat(), s.value("gridPositionY", 0.f).toFloat(), s.value("gridPositionZ", 0.f).toFloat() ); gridDimensions() = glm::ivec3( s.value("gridDimensionX", 128).toInt(), s.value("gridDimensionY", 128).toInt(), s.value("gridDimensionZ", 128).toInt() ); gridResolution() = s.value( "gridResolution", 0.05f ).toFloat(); timeStep() = s.value( "timeStep", 1e-5 ).toFloat(); implicit() = s.value( "implicit", true ).toBool(); materialPreset() = s.value( "materialPreset", MAT_DEFAULT).toInt(); showContainers() = s.value( "showContainers", true ).toBool(); showContainersMode() = s.value( "showContainersMode", WIREFRAME ).toInt(); showColliders() = s.value( "showColliders", true ).toBool(); showCollidersMode() = s.value( "showCollidersMode", SOLID ).toInt(); showGrid() = s.value( "showGrid", false ).toBool(); showGridMode() = s.value( "showGridMode", MIN_FACE_CELLS ).toInt(); showGridData() = s.value( "showGridData", false ).toBool(); showGridDataMode() = s.value( "showGridDataMode", NODE_DENSITY ).toInt(); showParticles() = s.value( "showParticles", true ).toBool(); showParticlesMode() = s.value( "showParticlesMode", PARTICLE_MASS ).toInt(); selectionColor() = glm::vec4( 0.302f, 0.773f, 0.839f, 1.f ); }
void UiSettings::saveSettings() { QSettings s( "CS224", "snow" ); s.setValue( "windowPosition", windowPosition() ); s.setValue( "windowSize", windowSize() ); s.setValue( "fillNumParticles", fillNumParticles() ); s.setValue( "fillResolution", fillResolution() ); s.setValue( "fillDensity", fillDensity() ); s.setValue("exportDensity", exportDensity()); s.setValue("exportVelocity",exportVelocity()); s.setValue( "exportFPS", exportFPS()); s.setValue( "maxTime", maxTime()); s.setValue( "gridPositionX", gridPosition().x ); s.setValue( "gridPositionY", gridPosition().y ); s.setValue( "gridPositionZ", gridPosition().z ); s.setValue( "gridDimensionX", gridDimensions().x ); s.setValue( "gridDimensionY", gridDimensions().y ); s.setValue( "gridDimensionZ", gridDimensions().z ); s.setValue( "gridResolution", gridResolution() ); s.setValue( "timeStep", timeStep() ); s.setValue( "implicit", implicit() ); s.setValue("materialPreset", materialPreset()); s.setValue( "showContainers", showContainers() ); s.setValue( "showContainersMode", showContainersMode() ); s.setValue( "showColliders", showColliders() ); s.setValue( "showCollidersMode", showCollidersMode() ); s.setValue( "showGrid", showGrid() ); s.setValue( "showGridMode", showGridMode() ); s.setValue( "showGridData", showGridData() ); s.setValue( "showGridDataMode", showGridDataMode() ); s.setValue( "showParticles", showParticles() ); s.setValue( "showParticlesMode", showParticlesMode() ); }
void GridExporter::write() { // m_writeMutex.lock(); m_writingFile = true; int numCells = m_grid->getNumberOfGridCells(); int sizeX = m_grid->getGridSizeX(); int sizeY = m_grid->getGridSizeY(); int sizeZ = m_grid->getGridSizeZ(); float* density = m_grid->getDensityArray(); float* velx = m_grid->getVelocityXArray(); float* vely = m_grid->getVelocityYArray(); float* velz = m_grid->getVelocityZArray(); float dx = m_grid->getVoxelSize(); exportDensity(m_filenameCounter, m_filenamePrefix, density, velx, vely, velz, sizeX, sizeY, sizeZ, dx); m_filenameCounter++; m_writingFile = false; // m_writeMutex.unlock(); }
void renderFunc() { glDepthMask(GL_TRUE); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); int gridSizeX = fsolver->getGridSizeX(), gridSizeY = fsolver->getGridSizeY(), gridSizeZ = fsolver->getGridSizeZ(); Float dx = fsolver->getVoxelSize(); const vector<Density> &density = fsolver->getDensity(); const Vector &curlMagnitude = fsolver->getCurlMagnitude(); const bool *solid = fsolver->getSolid(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0,0,-distZ,0,0,0,0,-1,0); glRotated(angleY, 1, 0, 0); glRotated(angleX, 0, 1, 0); glTranslatef(-gridSizeX/2.0f, -gridSizeY/2.0f, -gridSizeZ/2.0f); glCullFace(GL_NONE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glBegin(GL_QUADS); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glVertex3i(0, 0, 0); glVertex3i(0, gridSizeY, 0); glVertex3i(gridSizeX, gridSizeY, 0); glVertex3i(gridSizeX, 0, 0); glVertex3i(0, 0, gridSizeZ); glVertex3i(0, gridSizeY, gridSizeZ); glVertex3i(gridSizeX, gridSizeY, gridSizeZ); glVertex3i(gridSizeX, 0, gridSizeZ); glVertex3i(0, 0, 0); glVertex3i(0, 0, gridSizeZ); glVertex3i(0, gridSizeY, gridSizeZ); glVertex3i(0, gridSizeY, 0); glVertex3i(gridSizeX, 0, 0); glVertex3i(gridSizeX, 0, gridSizeZ); glVertex3i(gridSizeX, gridSizeY, gridSizeZ); glVertex3i(gridSizeX, gridSizeY, 0); glVertex3i(0, 0, 0); glVertex3i(0, 0, gridSizeZ); glVertex3i(gridSizeX, 0, gridSizeZ); glVertex3i(gridSizeX, 0, 0); glVertex3i(0, gridSizeY, 0); glVertex3i(0, gridSizeY, gridSizeZ); glVertex3i(gridSizeX, gridSizeY, gridSizeZ); glVertex3i(gridSizeX, gridSizeY, 0); glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glBegin(GL_QUADS); glColor4f(.5f, .5f, 1.0f, 1.0f); for (int z=0, pos = 0; z<gridSizeZ; ++z) { for (int y=0; y<gridSizeY; ++y) { for (int x=0; x<gridSizeX; ++x, ++pos) { if (!solid[pos]) continue; glVertex3i(x, y, z); glVertex3i(x, y+1, z); glVertex3i(x+1, y+1, z); glVertex3i(x+1, y, z); glVertex3i(x, y, z+1); glVertex3i(x, y+1, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y, z+1); glVertex3i(x, y, z); glVertex3i(x, y, z+1); glVertex3i(x, y+1, z+1); glVertex3i(x, y+1, z); glVertex3i(x+1, y, z); glVertex3i(x+1, y, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y+1, z); glVertex3i(x, y, z); glVertex3i(x, y, z+1); glVertex3i(x+1, y, z+1); glVertex3i(x+1, y, z); glVertex3i(x, y+1, z); glVertex3i(x, y+1, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y+1, z); } } } glEnd(); glDepthMask(GL_FALSE); glBegin(GL_QUADS); for (int z=0, pos = 0; z<gridSizeZ; ++z) { for (int y=0; y<gridSizeY; ++y) { for (int x=0; x<gridSizeX; ++x, ++pos) { if (solid[pos]) continue; if (displayMode == 0) { Float f = .5f * density[pos].density; glColor4f(1.0f, 1.0f, 1.0f, f); } else { Float f = .01f * curlMagnitude[pos]; glColor4f(0.0f, 0.0f, 1.0f, f); } glVertex3i(x, y, z); glVertex3i(x, y+1, z); glVertex3i(x+1, y+1, z); glVertex3i(x+1, y, z); glVertex3i(x, y, z+1); glVertex3i(x, y+1, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y, z+1); glVertex3i(x, y, z); glVertex3i(x, y, z+1); glVertex3i(x, y+1, z+1); glVertex3i(x, y+1, z); glVertex3i(x+1, y, z); glVertex3i(x+1, y, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y+1, z); glVertex3i(x, y, z); glVertex3i(x, y, z+1); glVertex3i(x+1, y, z+1); glVertex3i(x+1, y, z); glVertex3i(x, y+1, z); glVertex3i(x, y+1, z+1); glVertex3i(x+1, y+1, z+1); glVertex3i(x+1, y+1, z); } } } glEnd(); if (displayVelocities > 0) { glDisable(GL_BLEND); glBegin(GL_LINES); glColor4f(0.0f, 1.0f, 0.0f, 1.0f); for (int z=0, pos=0; z<gridSizeZ; ++z) { for (int y=0; y<gridSizeY; ++y) { for (int x=0; x<gridSizeX; ++x, ++pos) { if ((x%2) != 0 || (y%2) != 0 || (z%2) != 0) continue; Vector3 velocity; if (displayVelocities == 1) velocity = fsolver->getVelocity(Point3((x+.5f)*dx, (y+.5f)*dx, (z+.5f)*dx)); else if (displayVelocities == 2) velocity = fsolver->getForce(Point3((x+.5f)*dx, (y+.5f)*dx, (z+.5f)*dx)); velocity /= dx; glVertex3f(x+.5f, y+.5f, z+.5f); glVertex3f(x+.5f+velocity.x, y+.5f+velocity.y, z+.5f+velocity.z); } } } glEnd(); } glutSwapBuffers(); if (running) { fsolver->step(0.1f); exportDensity(frameCounter); screenshot(frameCounter++); glutPostRedisplay(); } }