void Camera::drawSunMask(GOIterator* gameObjects, BgObjectContainer* bgObjects, Level& level) { sunIt->object->draw(this, &FBO1); float particleId = 0.0f; BgOIterator* front = 0; for (BgOIterator* it = sunIt->next; it; it = it->next) { while(particleManager->getDepth(this, particleId) > it->object->getDepth() && particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } if (it->object->getDepth() < 1.0f) { front = it; break; } it->object->draw(this, &FBO1, sf::Color::Black); } level.drawGameGround(this, &FBO1, false, sf::Color::Black); while(particleManager->getDepth(this, particleId) > 1.0f && particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } //for (GOIterator* it = gameObjects; it; it = it->next) //{ // it->object->draw(this, &FBO1, false); //} if (front) { for (BgOIterator* it = front; it; it = it->next) { it->object->draw(this, &FBO1, sf::Color::Black); } } }
void Camera::draw(GOIterator* gameObjects, BgObjectContainer* bgObjects, Level& level, bool debug) { FBO1.setView(view); //FBO2.setView(view); depthShader.setParameter("time", gameClock->getTotalElapsedTime()); particleManager->sort(); if (sunIt) { FBO1.clear(sf::Color::Transparent); drawSunMask(gameObjects, bgObjects, level); sf::Vector2f sunPos = (sf::Vector2f)FBO1.mapCoordsToPixel(sunIt->object->getSprite().getPosition()); sunPos.x /= FBO1.getSize().x; sunPos.y /= FBO1.getSize().y; sunPos.y = 1.0f - sunPos.y; sunShader.setParameter("sun_pos", sunPos); sunShader.setParameter("weight", sunStrength); FBO1.display(); FBO2.clear(sf::Color::Transparent); FBO2.draw(sf::Sprite(FBO1.getTexture()), &sunShader); FBO2.display(); } FBO1.clear(); int particleId = 0; level.drawBackGround(this, &FBO1, debug); BgOIterator* front = 0; sunIt = 0; for (BgOIterator* it = bgObjects->begin; it; it = it->next) { while(particleManager->getDepth(this, particleId) > it->object->getDepth() && particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } if (it->object->getDepth() < 1.0f) { front = it; break; } it->object->draw(this, &FBO1); if (it->object->getName() == "sun") sunIt = it; } level.drawGameGround(this, &FBO1, debug); while(particleManager->getDepth(this, particleId) > 1.0f && particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } for (GOIterator* it = gameObjects; it; it = it->next) { it->object->draw(this, &FBO1, debug); } if (sunIt) { FBO1.setView(FBO1.getDefaultView()); FBO1.draw(sf::Sprite(FBO2.getTexture()), sf::BlendAdd); FBO1.setView(view); } FBO1.display(); FBO2.draw(sf::Sprite(FBO1.getTexture())); for (int i = 0; i < bubbles.size(); i++) { sf::CircleShape circleShape; float r = bubbles[i]->getRadius() * mToPx; sf::Vector2f p = MATH::vMtoPx(bubbles[i]->getParent()->getPosition()); circleShape.setRadius(r); circleShape.setOrigin(r,r); circleShape.setPosition(p); p = (sf::Vector2f)FBO2.mapCoordsToPixel(p, view); p.y = FBO2.getSize().y - p.y; r *= FBO1.getSize().x / view.getSize().x; bubbleShader.setParameter("texture", FBO2.getTexture()); bubbleShader.setParameter("position", p); bubbleShader.setParameter("radius", r); bubbleShader.setParameter("size", (sf::Vector2f)FBO2.getSize()); FBO1.draw(circleShape, &bubbleShader); } bubbles.clear(); if (front) { for (BgOIterator* it = front; it; it = it->next) { while(particleManager->getDepth(this, particleId) > it->object->getDepth() && particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } it->object->draw(this, &FBO1); } } while(particleId < particleManager->getSize()) { particleManager->draw(this, &FBO1, particleId); particleId++; } FBO1.display(); renderTarget->draw(sf::Sprite(FBO1.getTexture())); //HUD if (playerAi) { if (playerAi->getCurrWeapon() != PlayerComponent::Weapon::NONE) { //spr.setOrigin(112.0f / 2.0f, 150.0f / 2.0f); float slow = playerAi->getNumBubbles().y / 15.0f; sf::Sprite slowSpr(imageManager->getTexture("res/hud_blue.png")); sf::Vector2f size = (sf::Vector2f)slowSpr.getTexture()->getSize(); slowSpr.setPosition(44.0f, (renderTarget->getSize().y - 150) + (1.0f - slow) * size.y + 88.0f); slowSpr.setTextureRect(sf::IntRect(0.0f, size.y * (1.0f - slow), size.x, size.y * slow)); renderTarget->draw(slowSpr); float fast = playerAi->getNumBubbles().x / 15.0f; sf::Sprite fastSpr(imageManager->getTexture("res/hud_red.png")); size = (sf::Vector2f)fastSpr.getTexture()->getSize(); fastSpr.setPosition(0.0f, (renderTarget->getSize().y - 150.0f) + (1.0f - fast) * size.y + 1.0f); fastSpr.setTextureRect(sf::IntRect(0.0f, size.y * (1.0f - fast), size.x, size.y * fast)); renderTarget->draw(fastSpr); sf::Sprite spr(imageManager->getTexture("res/hud_frame.png")); spr.setPosition(0, renderTarget->getSize().y - 150); renderTarget->draw(spr); } //renderTarget->setView(oldView); } }