Skip to main content
GameDev.net gamedev.net
🔒 Locked

SFML: Different drawing order when rendering multiple widow, why?

Started by Concentrate Jan 28, 2012 at 1:43 AM 0 replies 2k views
Original Post
Concentrate
Concentrate
This is a C++/SFML/opengl application.

Ok here is the draw function for a grid like box.

//draws a simple grid

void draw(sf::RenderWindow& canvas)const{
for(int i = 0; i < HEIGHT; ++i){
for(int j = 0; j < WIDTH; ++j){
if(m_list[j].piece.get() != NULL){ //[1]
m_list[j].piece->draw(canvas);
}
canvas.Draw(m_list[j].sprite); //[2]
}
}
canvas.Draw( m_background ); //[3]
}


Here is an example of the rendered image https://imgur.com/7AzVN

Assume [1] is always false for now. Now from the picture you see that [3] gets drawn first then [2] gets drawn. Thats fine and dandy, although I think that's somewhat backwards. Now in the same application, when event X happens, I created another window, which uses the above
code. And I would figure, it would render the same image as shown previously, when correct settings are placed. But actually, what I am seeing is that, in the new window( which is setActive now) it actually draws [2] first then [3]. And hence [2] gets covered by [3], since [3] covers a greater area than [2]. Why the difference? This is basically the second window creation code :


PromotionPiecePicker::PromotionPiecePicker(const sf::RenderWindow& window): mainWindow(window){
m_window.Create(sf::VideoMode(400,400,32), "Promition Picker");
m_window.Clear(sf::Color::White);
m_grid.setBackgoundColor(sf::Color::White);
m_grid.setCellColor(sf::Color::Red);
m_window.SetFramerateLimit(60);
}

detail::IChessPieceEnums::PieceType PromotionPiecePicker::getUserPick()
{
m_window.SetActive();

detail::IChessPieceEnums::PieceType pieceType;

while(m_window.IsOpened())
{
sf::Event event;
//handle event
while(m_window.GetEvent(event))
{
// Close window : exit
if (event.Type == sf::Event::Closed){
m_window.Close();
}

// Escape key : exit
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Escape)){
m_window.Close();
}
/* handle event */
if(m_window.GetInput().IsMouseButtonDown(sf::Mouse::Left)){
m_window.Close();
cout << "in event\n";
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

_displaySelections();

m_window.Display();
}

//make main window active again
mainWindow.SetActive();

return pieceType;
}
void PromotionPiecePicker::_displaySelections(){
m_grid.draw(m_window);
}


Any advice guys? You can actually see the whole code here in github. The above code is from PromotionPiecePicker.cpp class.

https://github.com/d...aster/ChessGame
Concentrate
Concentrate
Ok problem is solved. The problem was that I was mixing some of opengl calls without saving the gl context. So as a resolution, I simply removed the opengl calls and replaced them with proper sfml calls.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.