void TerrainDeformationProgram::Render(RenderQueue* rq){ ShaderProgram* prog = g_ShaderBank.GetProgramFromHandle(m_DrawProgram); prog->Apply(); glBindVertexArray(0); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); //glBlendFunc(GL_SRC_ALPHA, GL_ONE); //additive for (auto& td : rq->GetDeformations()){ Terrain* terrain = g_TerrainManager.GetTerrainFromHandle(td.Terrain); glm::vec2 textureSize = terrain->GetHeightHighResSize(); m_FrameBuffer->SetTexture(terrain->GetHeightMap(), textureSize.x, textureSize.y); m_FrameBuffer->Apply(); glViewport(0, 0, textureSize.x, textureSize.y); //prog->SetUniformTextureHandle("g_Texture", m_BrushTexture, 0); m_BrushTex->Apply(prog->FetchUniform("g_Texture"), 0); prog->SetUniformVec4("g_Pos", glm::vec4(td.Position.x , 1.0f - td.Position.y, 0, 0)); prog->SetUniformVec4("g_Size", glm::vec4(td.Size, 1, 1)); glm::vec3 dir = td.Up ? glm::vec3(1) : glm::vec3(0); prog->SetUniformVec4("g_Color", glm::vec4(dir, td.Strength)); prog->SetUniformBool("g_GreyScale", false); glDrawArrays(GL_POINTS, 0, 1); //filter area glm::vec4 pixelArea = glm::vec4((td.Position * textureSize) - glm::vec2(-2), (td.Size * textureSize) + glm::vec2(4)); const int WORK_GROUP_SIZE = 32; GLuint WorkGroupSizeX = GLuint((pixelArea.z + WORK_GROUP_SIZE - 1) / float(WORK_GROUP_SIZE)); GLuint WorkGroupSizeY = GLuint((pixelArea.w + WORK_GROUP_SIZE - 1) / float(WORK_GROUP_SIZE)); ShaderProgram* prog = g_ShaderBank.GetProgramFromHandle(m_FilterProgram); prog->Apply(); prog->SetUniformVec4("g_PixelArea", pixelArea); glBindImageTexture(0, terrain->GetHeightMap(), 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F); glDispatchCompute(WorkGroupSizeX, WorkGroupSizeY, 1); } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_BLEND); }
Terrain *TerrainCreator::createTerrain(game::GameMap *gameMap, ui::LightManager *lightManager, ui::AmbientSoundManager *ambientSoundManager, const char *configFile) { /* std::string textFileName = configFile; textFileName += "/legacy.txt"; Parser::Parser parser(textFileName.c_str()); const Parser::string_map scene_properties = parser.GetProperties(); std::string forceMapName = Parser::GetString(scene_properties, "forceheightmap"); */ std::string forceMapName; Terrain *terrain = new Terrain(storm3d, scene, configFile, forceMapName.c_str(), gameMap->getAreaMap(), gameMap, lightManager, ambientSoundManager); int memRes = game::SimpleOptions::getInt(DH_OPT_I_TERRAIN_MEMORY_RESERVE); if (memRes < 0) memRes = 0; int preCache = game::SimpleOptions::getInt(DH_OPT_I_TERRAIN_MEMORY_PRECACHE); if (preCache < 0) preCache = 0; if (preCache > memRes) preCache = memRes; // terrain->GetTerrain()->SetMemoryReserve(memRes); // terrain->GetTerrain()->SetPreCache(preCache); std::string binFileString = configFile; binFileString += "/scene.bin"; // These maps should really come from bin file gameMap->setData(terrain->GetHeightMap(), terrain->GetDoubleHeightMap(), terrain->getHeightMapSize(), terrain->getTerrainSize(), terrain->getTerrainHeight(), binFileString.c_str()); gameMap->setTerrain(terrain->GetTerrain()); // set proper maps and stuff to light amount manager util::LightAmountManager::getInstance()->setMaps(gameMap, terrain->GetTerrain()); terrain->GetTerrain()->setObstacleHeightmap(gameMap->getObstacleHeightMap(), gameMap->getAreaMap()); // Haxhax, initialize here for now IStorm3D_Material *shadowMaterial = storm3d->CreateNewMaterial("shadow_decal"); shadowMaterial->SetBaseTexture(storm3d->CreateNewTexture("shadow_decal.tga")); terrain->GetTerrain()->getDecalSystem().setShadowMaterial(shadowMaterial); return terrain; }