This is my attempt at using a large RenderTexture, which is later scaled to fit properly on the screen. Although it works my problem is with the mouse offset - just can't seem to get it right.
#include <iostream>
#include <SFML/Graphics.hpp>
sf::CircleShape newCircle(sf::Vector2f pos)
{
sf::CircleShape circle;
circle.setPosition(pos);
circle.setRadius(10);
circle.setOrigin(circle.getRadius(), circle.getRadius());
circle.setFillColor(sf::Color::Green);
return circle;
}
int main()
{
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
sf::RenderWindow window(sf::VideoMode(1920 / 2, 1080 / 2), "RenderTexture", sf::Style::Default, settings);
window.setFramerateLimit(144);
sf::RenderTexture canvas;
canvas.create(3840, 2160);
canvas.clear(sf::Color::White);
sf::Event event;
std::vector<sf::CircleShape> circles;
bool isMoving = false;
sf::Clock clock;
sf::Vector2f offset(canvas.getSize().x / 2, canvas.getSize().y / 2);
while(window.isOpen())
{
sf::Vector2f mouseCoords = window.mapPixelToCoords(sf::Mouse::getPosition(window), window.getView());
sf::Vector2f offsetCoords = mouseCoords - offset;
while(window.pollEvent(event))
{
switch(event.type)
{
case sf::Event::Closed:
window.close();
break;
case sf::Event::Resized:
window.setView(sf::View(sf::FloatRect(0, 0, event.size.width, event.size.height)));
offset = sf::Vector2f((window.getSize().x - (canvas.getSize().x * 0.3333)) / 2, (window.getSize().y - (canvas.getSize().y * 0.3333)) / 2);
break;
case sf::Event::MouseButtonPressed:
isMoving = true;
break;
case sf::Event::MouseMoved:
if(isMoving == true)
{
circles.push_back(newCircle(offsetCoords));
}
break;
case sf::Event::MouseButtonReleased:
isMoving = false;
circles.clear();
}
}
for(int i = 0; i < circles.size(); ++i)
{
canvas.draw(circles[i]);
}
canvas.display();
window.clear(sf::Color(31, 31, 31));
sf::Sprite sprite(canvas.getTexture());
sprite.setScale(0.333, 0.333);
sprite.setPosition(sf::Vector2f((window.getSize().x - (canvas.getSize().x * sprite.getScale().x)) / 2, (window.getSize().y - (canvas.getSize().y * sprite.getScale().x)) / 2));
window.draw(sprite);
window.display();
circles.clear();
float currentTime = clock.restart().asSeconds();
int fps = 1.f / currentTime;
std::cout<<fps<<std::endl;
}
}