113 lines
3.1 KiB
C++
113 lines
3.1 KiB
C++
#include "UI.hpp"
|
|
|
|
#include <stdexcept>
|
|
|
|
#include <SFML/Graphics/Texture.hpp>
|
|
#include <SFML/Graphics/Sprite.hpp>
|
|
#include <SFML/Graphics/BlendMode.hpp>
|
|
#include <SFML/Graphics/RenderStates.hpp>
|
|
#include <SFML/Window/ContextSettings.hpp>
|
|
|
|
#include <SFML/Graphics/CircleShape.hpp>
|
|
|
|
#define SF_COLOR_4CHEX(h) sf::Color((uint32_t)h)
|
|
|
|
|
|
void UI::SetRTSize(unsigned int w, unsigned int h, bool recreateCanvas) {
|
|
mRTSize.x = w; mRTSize.y = h;
|
|
|
|
// Don't resize/recreate canvas, this cut the fixed sprite
|
|
//TODO: use scaling feature on the assets to put on the canvas, then resize the canvas
|
|
if (recreateCanvas)
|
|
CreateDefaultRenderWindow();
|
|
}
|
|
|
|
void UI::CreateDefaultRenderWindow() {
|
|
sf::ContextSettings sViewSettings;
|
|
sViewSettings.depthBits = 0;
|
|
sViewSettings.stencilBits = 0;
|
|
sViewSettings.antialiasingLevel = 8;
|
|
sViewSettings.sRgbCapable = true;
|
|
|
|
if (!mUIRender.create(mRTSize.x, mRTSize.y, sViewSettings))
|
|
throw std::runtime_error("Texture renderer creation failure");
|
|
|
|
mUIRender.setSmooth(true);
|
|
mUIRender.setRepeated(false);
|
|
}
|
|
|
|
void UI::DrawUIOnRenderWindow(std::shared_ptr<sf::RenderWindow>& context, float& viewX, float& viewY) {
|
|
sf::Sprite spriteRender;
|
|
spriteRender.setTexture(this->mUIRender.getTexture());
|
|
spriteRender.setPosition(0.0f, 0.0f);
|
|
spriteRender.setScale(mRTSize.x / viewX, mRTSize.y / viewY);
|
|
context->draw(spriteRender);
|
|
}
|
|
|
|
|
|
CockpitUI::CockpitUI(unsigned int w, unsigned int h) : UI(w, h) {
|
|
CreateDefaultRenderWindow();
|
|
|
|
mStaticCockpitTexture.setSrgb(true);
|
|
if (!mStaticCockpitTexture.loadFromFile("cockpit_ui_empty_rescaled.png", sf::IntRect(0, 0, 1280, 780)))
|
|
throw std::runtime_error("Unable to load texture datas");
|
|
}
|
|
|
|
void CockpitUI::Update() {
|
|
|
|
}
|
|
|
|
void CockpitUI::Draw(std::shared_ptr<sf::RenderWindow>& context) {
|
|
sf::BlendMode sBM = sf::BlendAlpha;
|
|
sf::RenderStates sRS(sBM);
|
|
|
|
// Clear the UI screen
|
|
mUIRender.clear(sf::Color::Transparent);
|
|
|
|
// Draw the radar display
|
|
sf::CircleShape radar(95, 8);
|
|
radar.setRotation(22.5f);
|
|
radar.setPosition(sf::Vector2f(838,378));
|
|
radar.setFillColor(SF_COLOR_4CHEX(0x666666FF));
|
|
mUIRender.draw(radar, sRS);
|
|
|
|
// Draw the static board
|
|
sf::Sprite staticBoardSprite(mStaticCockpitTexture);
|
|
mUIRender.draw(staticBoardSprite, sRS);
|
|
|
|
// Do the final texture render
|
|
mUIRender.display();
|
|
|
|
// OnScreen rendering
|
|
auto tvSize = sf::Vector2f(1280.f, 720.f);
|
|
DrawUIOnRenderWindow(context, tvSize);
|
|
}
|
|
|
|
|
|
WorldUI::WorldUI(unsigned int w, unsigned int h, std::shared_ptr<Graphic3DRenderer>& engineInstance) : UI(w, h), mWorld3D(engineInstance) {
|
|
CreateDefaultRenderWindow();
|
|
|
|
mUIRender.clear(sf::Color::Black);
|
|
mUIRender.display();
|
|
}
|
|
|
|
void WorldUI::Update() {
|
|
|
|
}
|
|
|
|
void WorldUI::Draw(std::shared_ptr<sf::RenderWindow>& context) {
|
|
sf::BlendMode sBM = sf::BlendNone;
|
|
sf::RenderStates sRS(sBM);
|
|
|
|
// Clear the UI screen
|
|
mUIRender.clear(sf::Color::Transparent);
|
|
|
|
// Draw the 3D view
|
|
mWorld3D->Draw(mUIRender);
|
|
|
|
// Do the final texture render
|
|
mUIRender.display();
|
|
|
|
// OnScreen rendering
|
|
UI::Draw(context);
|
|
} |