Hello,
I've recently started using the Quad Tree in order to render the objects of the scene, which makes it a bit dependent on the physical location of the objects, isn't it ?
Closer objects are drawn in front and farther object are drawn into the back side.
Beside that, i've added a Layer attribute to the objects to create a discrepancy between them. Each one on its own level. ( layer ).
This is perform by creating as many quad_tree as the total number of existent layers.
Now before exposing the problem that i am facing: here is the render call sequence
void Scene::draw(){
// decl: std::vector< quad_tree* > quad_heads;
for( int i=0; i<static_cast<int>(GoLayer::LayerCount); i++){
gdf::kernel::GameInfo::game_info->sf::RenderWindow::draw( *(quad_heads[i]) );
}
}
Every QuadTree node's content holds a pointer to the GameObject to draw.
The QuadTree is generated when the Scene is updating all GameObject. ( Hierarchical Tree structure )
void Scene::update(sf::Time dt){
// .......
if( !root_.expired() ){
for( int i=0; i<static_cast<int>(GoLayer::LayerCount); i++){
// PS1
quad_heads.resize( static_cast<int>(GoLayer::LayerCount) );
quad_heads[i] = new quad_tree( AABB(sf::Vector2f(500,500), sf::Vector2f(500,500) ) );
}
root_.get()->update(dt);
}
PS1: The reason here. Is that i am deleting and recreating the quad tree structure every iteration ( I don't know if it is the right way to do it )
When update method is invoked on the GameObject (root_). It will recursively build the QuadTree based on the Layer value of the GameObject accordingly.
void GameObject::update( sf::Time dt ){
// .....
scene()->quad_heads[ static_cast<int>(layer_) ]->insert( QuadTreeNode<GameObject>( position, this /*pointer_to_go*/) );
}
What if i want to create a specific rendering logic,
For example, within the same entity ( Entity here refers to a sub-hierarchy of game objects ).
I want to make a specific rendering order totally independent from the positioning of the sub-gameobjects.
Here is a schematic
This diagram represents the physical location of the GameObject within the scene.
This diagram is the Hierarchical Tree for the same structure ( Used for updates )
As for this one, is the QuadTree generated.
In @Diag 1, the entity here covers all the objects within the blue dashed square. having as a parent object n°1.
Now the situation is : If the logic says: object n°3 must be on top of object n°1. and somehow, the texture/sprite of the object
n°3 is big enough to interlace with n°1's texture. In this case using the QuadTree rendering policy, the object n°3 will be behind the object n°1 ( due to positioning criteria ). Same for n°1 and n°5 ( with opposite context ).
My point is, i want to make beside the QuadTree rendering policy, a relative rendering order within the same Entity.
Hope the idea was clear.
Cordially.