Jump to content



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

  • You cannot reply to this topic
1 reply to this topic

#1 D.Chhetri   Members   -  Reputation: 98

Like
0Likes
Like

Posted 27 January 2012 - 07:43 PM

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[i][j].piece.get() != NULL){	 //[1]
						m_list[i][j].piece->draw(canvas);  
					}
					canvas.Draw(m_list[i][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
Edge cases will show your design flaws in your code!
Visit my site
Visit my FaceBook
Visit my github

Ad:

#2 D.Chhetri   Members   -  Reputation: 98

Like
0Likes
Like

Posted 28 January 2012 - 06:51 PM

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.
Edge cases will show your design flaws in your code!
Visit my site
Visit my FaceBook
Visit my github






We are working on generating results for this topic
PARTNERS