1
Graphics / Estabish a rendering order within a same entity
« on: March 02, 2017, 04:07:14 pm »
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
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 )
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.
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.
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]) );
}
}
// 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);
}
// .......
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*/) );
}
// .....
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.