static void page_create( Page* pPage, int width, int height ) { SYS_VERIFY( rendertarget_create( &pPage->bgTarget, width, height, PixelFormat_R8G8B8A8 ) ); SYS_VERIFY( rendertarget_create( &pPage->fgTarget, width, height, PixelFormat_R8G8B8A8 ) ); SYS_VERIFY( rendertarget_create( &pPage->burnTarget, width, height, PixelFormat_R8G8B8A8 ) ); // render into render target: graphics_setRenderTarget( &pPage->bgTarget ); graphics_setBlendMode( BlendMode_Disabled ); // render paper: graphics_setShader( &s_renderer.paperShader ); graphics_setFp4f( 0u, float_rand(), float_rand(), 2.0f / width, 2.0f / height ); graphics_setVp4f( 0u, 32.0f, 18.0f, 0.4f, 0.3f ); graphics_setFsTexture(0,s_renderer.noiseTarget.id,SamplerState_MirrorU_MirrorV_Bilinear); graphics_drawFullscreenQuad(); // clear fg+burn target: graphics_setShader( 0 ); graphics_setRenderTarget( &pPage->fgTarget ); graphics_clear( 0.0f, 0.0f, 0.0f, 0.0f ); graphics_setRenderTarget( &pPage->burnTarget ); graphics_clear( 0.0f, 0.0f, 0.0f, 0.0f ); }
int pickFrom2(int A, int probA, int B, int probB) { float R = float_rand() * (probA + probB); if (R < probA) return A; else return B; }
float calc_pi(unsigned long points) { unsigned long int z = 0, inside = 0; float x, y, rootxy, calculated_pi; while(z < points) { x = float_rand(); y = float_rand(); rootxy = sqrt(pow(x, 2) + pow(y, 2)); if (rootxy <= 1.0) inside++; z++; } calculated_pi = 4 * (float)inside / points; return calculated_pi; }
int pickFrom3(int A, int probA, int B, int probB, int C, int probC) { float R = float_rand() * (probA + probB + probC); if (R < probA) return A; else if (R < probA + probB) return B; else return C; }
int pickFrom4(int A, int probA, int B, int probB, int C, int probC, int D, int probD) { float R = float_rand() * (probA + probB + probC + probD); if (R < probA) return A; else if (R < probA + probB) return B; else if (R < probA + probB + probC) return C; else return D; }
int SpiffRand(int min, int max) //returns a random integer min to max inclusive { return ((int)(float_rand() * (max + 1 - min))) + min; }
void World::OnUpdate(const sf::Time& dt) { // Update the camera. cam.Update(); // Move the camera. if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { cam.Move(Vector3(0.0f, 0.0f, -5.0f * dt.asSeconds())); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { cam.Move(Vector3(0.0f, 0.0f, 5.0f * dt.asSeconds())); } if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) { cam.Move(Vector3(-5.0f * dt.asSeconds())); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) { cam.Move(Vector3(5.0f * dt.asSeconds())); } // Rotate camera via mouse. sf::Vector2i mpos = sf::Mouse::getPosition(window); if(mouseEnabled) sf::Mouse::setPosition(sf::Vector2i(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2), window); sf::Vector2i deltaPos = sf::Mouse::getPosition(window) - mpos; cam.Rotate(deltaPos.x * 1.5f * dt.asSeconds(), deltaPos.y * 1.5f * dt.asSeconds(), 0.0f); // Sound Spatialization //std::cout << "Pos: " << cam.GetPosition() << "\n"; sf::Listener::setPosition(cam.GetPosition().ToSFMLVec()); sf::Listener::setDirection(cam.GetDirection().ToSFMLVec()); sf::Listener::setUpVector(cam.GetUp().ToSFMLVec()); // if (sndExplode.getStatus() == sf::Sound::Stopped) //sndExplode.play(); // Move light up and down. Vector3 lcpos = pointLights[0].GetPosition(); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) exposure -= 1.0f * dt.asSeconds(); else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) exposure += 1.0f * dt.asSeconds(); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { const Color& col = pointLights[0].GetColor(); pointLights[0].SetColor(Color(col.R(), col.G(), col.B() + 1.0f * dt.asSeconds())); std::cout << col.B() << "\n"; } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { const Color& col = pointLights[0].GetColor(); pointLights[0].SetColor(Color(col.R(), col.G(), col.B() - 1.0f * dt.asSeconds())); std::cout << col.B() << "\n"; } // Randomize Attenuations. if (sf::Keyboard::isKeyPressed(sf::Keyboard::I)) { for (auto& l : pointLights) { float catt = ((float)rand() / (float)RAND_MAX); float latt = ((float)rand() / (float)RAND_MAX); float eatt = ((float)rand() / (float)RAND_MAX); l.SetAttenuationConstant(catt); l.SetAttenuationLinear(latt); l.SetAttenuationExponential(eatt); const Color& c = l.GetColor(); float mc = fmax(fmax((float)c.R(), (float)c.G()), (float)c.B()); float ret = (-latt + sqrtf(latt * latt - 4 * eatt * (eatt - 256 * mc * l.GetDiffuseIntensity()))) / 2 * eatt; l.SetScale(Vector3(ret, ret, ret)); } } // Randomize intensity. if (sf::Keyboard::isKeyPressed(sf::Keyboard::K)) { for (auto& l : pointLights) { float ambient = ((float)rand() / (float)RAND_MAX); float diff = ((float)rand() / (float)RAND_MAX); l.SetAmbientIntensity(ambient); l.SetDiffuseIntensity(diff); // Generate Color float r = float_rand(0.0f, maxCol); float g = float_rand(0.0f, maxCol); float b = float_rand(0.0f, maxCol); l.SetColor(Color(r, g, b, 1.0f)); } } // Uniforms mv += 0.2f * dt.asSeconds(); pointLights[0].SetPosition(Matrix::GetVectorTransform(Matrix::CreateYRotation(mv), spherePos)); if (terrainMove) tv += 0.1f * dt.asSeconds(); /*if (exposure >= 10.0f) exposureVar = -1.0f; else if (exposureVar <= 0.0f) exposureVar = 1.0f; exposure += exposureVar * dt.asSeconds();*/ }
World::World(sf::RenderWindow& inWindow) : window(inWindow), gbuffer(WINDOW_WIDTH, WINDOW_HEIGHT), hdrDownsampleTexture(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, true), hdrBlurTexture(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, true), hdrDownsample2Texture(WINDOW_WIDTH / 4, WINDOW_HEIGHT / 4, true), hdrBlur2Texture(WINDOW_WIDTH / 4, WINDOW_HEIGHT / 4, true), fullscreenQuad(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT), aaTexture(WINDOW_WIDTH, WINDOW_HEIGHT) { // OpenGL State glBlendEquation(GL_FUNC_ADD); glBlendFunc(GL_ONE, GL_ONE); glStencilOpSeparate(GL_BACK, GL_KEEP, GL_INCR_WRAP, GL_KEEP); glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_DECR_WRAP, GL_KEEP); // Seed the PRNG. srand(static_cast<unsigned int>(time(0))); // Load light meshes. pointLightMesh.LoadFromFile("Models/pointlightMesh.obj"); spotLightMesh.LoadFromFile("Models/spotlightMesh.obj"); directionalLightMesh.LoadFromFile("Models/directionalMesh.obj"); // Lighting Shaders. pointLightShader.LoadFromFile("Shaders/lightShader.vert", "Shaders/pointlightShader.frag"); spotLightShader.LoadFromFile("Shaders/lightShader.vert", "Shaders/spotlightShader.frag"); directionalLightShader.LoadFromFile("Shaders/lightShader.vert", "Shaders/directionalShader.frag"); // HDR Shaders. hdrDownsample.LoadFromFile("Shaders/fsquad.vert", "Shaders/hdrDownsample.frag"); hdrTonemap.LoadFromFile("Shaders/fsquad.vert", "Shaders/hdrTonemap.frag"); hdrBlur.LoadFromFile("Shaders/fsquad.vert", "Shaders/hdrBlur.frag"); hdrBrightness.LoadFromFile("Shaders/fsquad.vert", "Shaders/hdrBrightness.frag"); // Load Models. mdl2.LoadFromFile("Models/sphere.obj"); mdl.LoadFromFile("Models/floor.obj"); mdl3.LoadFromFile("Models/sphere.obj"); quadMesh.LoadFromFile("Models/quad.obj"); // Load Shaders basicShader.LoadFromFile("Shaders/basic.vert", "Shaders/basic.frag"); pass1Shader.LoadFromFile("Shaders/drpass1.vert", "Shaders/drpass1.frag"); pass2Shader.LoadFromFile("Shaders/drpass2.vert", "Shaders/drpass2.frag"); pass2ShaderDirectional.LoadFromFile("Shaders/empty.vert", "Shaders/drpass2directional.frag"); quadShader.LoadFromFile("Shaders/fsquad.vert", "Shaders/hdrTonemap.frag"); terrainShader.LoadFromFile("Shaders/terrainshader.vert", "Shaders/terrainshader.frag"); flatShader.LoadFromFile("Shaders/basic.vert", "Shaders/flatshade.frag"); emptyShader.LoadFromFile("Shaders/empty.vert", "Shaders/empty.frag"); sphereShader.LoadFromFile("Shaders/sphere.vert", "Shaders/sphere.frag"); // Anti-Aliasing Shaders #if USE_FXAA == 1 fxaaShader.LoadFromFile("Shaders/fxaa.vert", "Shaders/fxaa.frag"); #endif baseAAShader.LoadFromFile("Shaders/baseaa.vert", "Shaders/baseaa.frag"); // Load textures. mdlTex.loadFromFile("Textures/test.png"); terrainTexture.loadFromFile("Textures/terraintex.png"); terrainWater.loadFromFile("Textures/terrainwater.png"); // Main world directional light. DirectionalLight worldLight; worldLight.SetDirection(Vector3(-1.0f, 0.0f, 0.0f)); worldLight.SetColor(Color(0.8f, 0.8f, 0.8f)); worldLight.SetDiffuseIntensity(0.9f); worldLight.SetAmbientIntensity(0.4f); directionalLights.push_back(worldLight); // Lights const unsigned int numLights = 40; const float lightRadius = 2.0f; PointLight l; l.SetPosition(Vector3(10.0f, 2.0f, 10.0f)); l.SetScale(Vector3(3.0f, 3.0f, 3.0f)); l.SetColor(Color(0.0f, 0.0f, 1.4f, 1.0f)); l.SetAttenuationConstant(0.4f); l.SetDiffuseIntensity(0.4f); l.SetAmbientIntensity(0.2f); pointLights.push_back(l); const int maxXZ = 15; const int minXZ = -15; const int maxY = 5; const float minRad = 0.3f; const float maxRad = 2.0f; for (int i = 0; i < numLights; i++) { PointLight l; // Generate position. int x = (rand() % (maxXZ - minXZ)) + minXZ; int y = (rand() % maxY); int z = (rand() % (maxXZ - minXZ)) + minXZ; l.SetPosition(Vector3(x, y, z)); // Generate Scale float frand = ((float)rand() / (float)RAND_MAX); float fdiff = maxRad - minRad; //l.SetScale(Vector3(scale, scale, scale)); // Generate Color float r = float_rand(0.0f, maxCol); float g = float_rand(0.0f, maxCol); float b = float_rand(0.0f, maxCol); l.SetColor(Color(r, g, b, 1.0f)); float ambient = ((float)rand() / (float)RAND_MAX); float diff = ((float)rand() / (float)RAND_MAX); l.SetAmbientIntensity(ambient); l.SetDiffuseIntensity(diff); float catt = ((float)rand() / (float)RAND_MAX); float latt = ((float)rand() / (float)RAND_MAX); float eatt = ((float)rand() / (float)RAND_MAX); float mc = fmax(fmax((float)r, (float)g), (float)b); float ret = (-latt + sqrtf(latt * latt - 4 * eatt * (eatt - 256 * mc * diff))) / 2 * eatt; l.SetScale(Vector3(ret, ret, ret)); l.SetAttenuationConstant(catt); l.SetAttenuationLinear(latt); l.SetAttenuationExponential(eatt); pointLights.push_back(l); } // Set the initial position of the sphere spherePos = Vector3(10.0f, 3.0f, 10.0f); // Setup the help text. defaultFont.loadFromFile("arial.ttf"); helpText.setFont(defaultFont); helpText.setString("Controls:\n" \ "Mouse: Camera direction.\n" \ "WASD: Camera movement.\n" \ "I: Randomize light attenuations.\n" \ "K: Randomize light color and intensity.\n" \ "Insert: Disable mouse.\n" \ "Delete: Switch shown render target.\n" \ "Home: Disable/Enable terrain movement.\n" ); helpText.setCharacterSize(14); helpText.setColor(sf::Color(255, 0, 255, 255)); targetText.setFont(defaultFont); targetText.setCharacterSize(14); targetText.setPosition(sf::Vector2f(0.0, window.getSize().y - 25)); targetText.setString("Current Buffer: Final Output"); targetText.setColor(sf::Color(255, 0, 255, 255)); // Sounds sndExplodeBuffer.loadFromFile("explode.wav"); sndExplode.setBuffer(sndExplodeBuffer); sndExplode.setAttenuation(10.0f); sndExplode.setMinDistance(60.0f); sndExplode.setPosition(sf::Vector3f(0.0f, 1.0f, 0.0f)); }