SFML / imgui-sfml

Dear ImGui backend for use with SFML

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Issue Rendering sf::RenderTexture to ImGui::Image

Autumn-Bomb opened this issue · comments

I'm currently having issues rendering a RenderTexture to an ImGui::Image. I've rendered my RenderTexture to my sf::RenderWindow with no issues as shown in the screenshot but for some reason it doesn't want to render inside my ImGui::Image.

As below, the RenderTexture drawn in my sf::RenderWindow and the White Square underneath is my sf::RenderTexture being drawn to my ImGui::Image.

unknown

2DRenderer.cpp

#include "2DRenderer.h"
#include <iostream> 

AutumnEngine::Renderer::Renderer()
{
	std::cout << "Initialising Renderer!";
}
AutumnEngine::Renderer::~Renderer(){}

void AutumnEngine::Renderer::Create(const unsigned int width, const unsigned int height)
{
	std::cout << "\nCreating RenderTexture!\n";
	m_RenderTexture.create(width, height);
	this->width = width;
	this->height = height;
	std::cout << "\nCreated RenderTexture!\n";
	
	DrawShape();
}

void AutumnEngine::Renderer::AddToRenderTexture(sf::Drawable& drawable)
{
	std::cout << "\nDrawing Drawable!\n";
	m_RenderTexture.clear(sf::Color::Red);
	m_RenderTexture.draw(drawable);
	m_RenderTexture.display();
	std::cout << "Drawable has been Drawn!\n";
}

void AutumnEngine::Renderer::Clear(sf::Color color)
{
	m_RenderTexture.clear(color);
}

void AutumnEngine::Renderer::Clear()
{
	m_RenderTexture.clear();
}

void DrawShape()
{
	rect.setSize(sf::Vector2f(100, 100));
	rect.setPosition(sf::Vector2f(100, 100));
	rect.setFillColor (sf::Color::Black);
	AddToRenderTexture(rect);
}

SceneViewport.cpp

#include "../SceneViewport/SceneViewport.h"

AutumnEngine::SceneViewport::SceneViewport(){}
AutumnEngine::SceneViewport::~SceneViewport() {}

void AutumnEngine::SceneViewport::ShowSceneViewport()
{
    ImGui::Begin("Scene Viewport", NULL, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_None);

    if (!m_RendererCreated)
    {
        m_Renderer->Create(ImGui::GetWindowWidth() - 25.f, ImGui::GetWindowHeight() - 65.f);
        m_RendererCreated = true;
    }

    ImGui::SameLine(ImGui::GetWindowWidth() / 2 - 60);
    ImGui::Button("Play", ImVec2(40, 20));
    ImGui::SameLine();
    ImGui::Button("Pause", ImVec2(40, 20));
    ImGui::SameLine();
    ImGui::Button("Stop", ImVec2(40, 20));

    ImGui::Separator();

    ImGui::Image(&m_Renderer->GetRenderTexture(), ImVec2(m_Renderer->GetRenderTexture().getSize().x, m_Renderer->GetRenderTexture().getSize().y));

    ImGui::End();
}

I guess this should fix it:

ImGui::Image(*m_Renderer->GetRenderTexture(), ImVec2(m_Renderer->GetRenderTexture().getSize().x, m_Renderer->GetRenderTexture().getSize().y));

When you do:

&m_Renderer->GetRenderTexture()

You're passing a pointer to a pointer and so it triggers another overload of ImGui::Image (the one which gets ImTextureID, I think)

I have tried that but it says that it's not allowed, "no operator "*" matches these operands, operands types are: *sf::RenderTexture()"

It wasn't using the overloaded ImGui::Image method that's why. Thank you. This will be closed.