void XBScene1::setup(XBBaseGUI *_gui) { XBBaseScene::setup(_gui); wavesMask.allocate(ofGetWidth(), ofGetHeight(), GL_RGB); wavesMask.begin(); ofSetBackgroundAuto(false); ofBackground(0, 0, 0); wavesMask.end(); initWindows(); initParticles(); initWaves(); initStones(); initLines(); blur.setup(getMainFBO().getWidth(), getMainFBO().getHeight(), 0); XBScene1GUI *myGUI = (XBScene1GUI *) gui; myGUI->flashDirector.getParameter().cast<bool>().addListener(this, &XBScene1::flashDirector); }
void XBScene1::keyReleased(int key) { XBBaseScene::keyReleased(key); switch (key) { case 'z': case 'Z': { waves.clear(); initWaves(); } case 'x': case 'X': { fakeEvent = false; } case 'c': case 'C': { fakeCelloEvent = false; // violinLine.clear(); } default: break; } }
void ComputeWaterSimulation::runWaterSimulation() { // update surface params if (mGridSize != mPrevGridSize || mNumWaves != mPrevNumWaves) { initWaves(mNumWaves); mPrevNumWaves = mNumWaves; mPrevGridSize = mGridSize; } // add rain if (mSettings.AddRain) { if (mSettings.Frequency != 0 && mDisturbance.w <= 0.0f) { if (++mRainFrame >= mSettings.Frequency) { mRainFrame = 0; mDisturbance = nv::vec4f(Rand(-2.0f, 2.0f), Rand(-2.0f, 2.0f), mSettings.Size, Rand(-mSettings.Strength, mSettings.Strength)); } } } // project ray using joystick if (mJoystickDown) { // use screen center nv::vec3f point = unProject((float)m_width / 2, (float)m_height / 2); nv::vec2f gridPos; // project onto each wave for(uint32_t i = 0; i < mNumWaves; i++) { if (mWaves[i]->mapPointXZToGridPos(point, gridPos)) { mDisturbance = nv::vec4f(point.x, point.z, mSettings.Size, mSettings.Strength); } } } // sync CPU and GPU buffers if settings changed if (mSettings.UseComputeShader != mPrevFrameUseComputeShader) { if (mSettings.UseComputeShader) { for(uint32_t i = 0; i < mNumWaves; i++) { void* ptr; // sync height data glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_WRITE_BIT); memcpy(ptr, mWaves[i]->getSimulation().getHeightField(), mWaves[i]->getSimulation().m_heightFieldSize); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // sync velocity data glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_WRITE_BIT); memcpy(ptr, mWaves[i]->getSimulation().getVelocity(), mWaves[i]->getSimulation().m_heightFieldSize); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } } else { for(uint32_t i = 0; i < mNumWaves; i++) { void* ptr; // sync height data glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_READ_BIT); memcpy(mWaves[i]->getSimulation().getHeightField(), ptr, mWaves[i]->getSimulation().m_heightFieldSize); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // sync velocity data glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); ptr = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, mWaves[i]->getSimulation().m_heightFieldSize, GL_MAP_READ_BIT); memcpy(mWaves[i]->getSimulation().getVelocity(), ptr, mWaves[i]->getSimulation().m_heightFieldSize); glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } //HACK: simulate once even if animation disabled bool mCurAnimate = mSettings.Animate; mSettings.Animate = true; simulateWaterCPU(); mSettings.Animate = mCurAnimate; } mPrevFrameUseComputeShader = mSettings.UseComputeShader; } if (mSettings.UseComputeShader) { simulateWaterGPU(); } else { simulateWaterCPU(); } // reset disturbance mDisturbance = nv::vec4f(0.0f); }
void ComputeWaterSimulation::initRendering(void) { // OpenGL 4.3 is the minimum for compute shaders if (!requireMinAPIVersion(NvGfxAPIVersionGL4_3())) return; // check if we need glMemoryBarrier hack (on non-NV, we are // seeing corruption caused by glMemoryBarrier not actually // synchronizing) const char* vendorName = (const char*)glGetString(GL_VENDOR); if (!strstr(vendorName, "NVIDIA")) { LOGI("glMemoryBarrier() hack enabled. Vendor = %s\n", vendorName); m_hackMemoryBarrier = true; } glClearColor(0.0f, 0.0f, 0.0f, 1.0f); NvAssetLoaderAddSearchPath("es3aep-kepler/ComputeWaterSimulation"); int cx, cy, cz; glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &cx ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &cy ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &cz ); LOGI("Max compute work group count = %d, %d, %d\n", cx, cy, cz ); int sx, sy, sz; glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &sx ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &sy ); glGetIntegeri_v( GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &sz ); LOGI("Max compute work group size = %d, %d, %d\n", sx, sy, sz ); CHECK_GL_ERROR(); // load shaders mWaterShader[WATER_SHADER_DEFAULT] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/water.frag"); mWaterShader[WATER_SHADER_NORMALS] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/waterNormals.frag"); mWaterShader[WATER_SHADER_FRESNEL] = NvGLSLProgram::createFromFiles("shaders/water.vert", "shaders/waterFresnel.frag"); // load compute shaders std::string src; src = loadShaderSourceWithUniformTag("shaders/uniforms.h", "shaders/WaterTransformPass.glsl"); createShaderPipelineProgram(GL_COMPUTE_SHADER, src.c_str(), mTransformPipeline, mTransformProgram); src = loadShaderSourceWithUniformTag("shaders/uniforms.h", "shaders/WaterGradientsPass.glsl"); createShaderPipelineProgram(GL_COMPUTE_SHADER, src.c_str(), mGradientsPipeline, mGradientsProgram); mSkyTexture = NvImage::UploadTextureFromDDSFile("sky/day.dds"); // init GPU buffers uint32_t maxGridSize = MAX_GRID_SIZE + 2; GLuint size = sizeof(GLfloat) * maxGridSize * maxGridSize; for(int i = 0; i < 4; i++) { glGenBuffers(1, &mHeightBuffer[i]); glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); glBufferData(GL_SHADER_STORAGE_BUFFER, size, NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glGenBuffers(1, &mVelocityBuffer[i]); glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); glBufferData(GL_SHADER_STORAGE_BUFFER, size, NULL, GL_DYNAMIC_DRAW); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); } initWaves(mNumWaves); //for(int i = 0; i < 4; i++) //{ // glGenBuffers(1, &mHeightBuffer[i]); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, mHeightBuffer[i]); // glBufferData(GL_SHADER_STORAGE_BUFFER, size, mWaves[0]->getSimulation().getHeightField(), GL_STATIC_DRAW); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // glGenBuffers(1, &mVelocityBuffer[i]); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, mVelocityBuffer[i]); // glBufferData(GL_SHADER_STORAGE_BUFFER, size, mWaves[0]->getSimulation().getHeightField(), GL_STATIC_DRAW); // glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); //} }