Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I have a scenegraph that represents the whole world. However, at the moment if there are multiple copies of the same scene graph (aka the same model) it will just create a new scenegraph linking. This works, however, the loading time is insane. Which is to be expected. I have tried to load the model's scene graphs and simply just have the world link to these. However, when I need to travel up the scenegraph the model doesn't know anything about the world unless you count the last one that was using it. Making it impossible to render the models in the right place as everytime you travel up the scenegraph you get into the problem of not knowing where to go from the models node to get to the world node.

For example I have a scene graph for each model in the world, like a boat has a scene graph. If I want multiple copies of the boat in the world at the moment I will have to load the boat x amount of times. Which I don't want. I want to be able to specify the boat, load it, then have a world scenegraph which specifies down at the leaf nodes (Load boat). What is a design that would solve this problem?

share|improve this question
    
Your problem/question is unclear. Do you have a forest of scene graphs? Do your scene graphs' root nodes mistakenly attach themselves to the leaves of other scene graphs? Are the scene graphs clones? Why the "many worlds" and not just one world with all of your objects and one scene graph..? –  teodron Apr 19 '12 at 16:51
    
Ive added more detail I hope that is helpful –  Chris Condy Apr 19 '12 at 16:56

2 Answers 2

up vote 6 down vote accepted

You seem to be treating your scene graph as a tree - each scene contains N boats, each of which contains its own copy of the "boat" scene graph, etc. This is not fundamentally wrong, but can certainly be improved upon. The following diagram illustrates my understanding of your current approach, for a scene with two boats1:

Scene tree

Rather than storing N copies of the "boat" scene graph if you have N boats, instead create N copies of a "SceneGraphReference" node that all reference a single copy of the "boat" scene graph. Each such node should maintain its own position/rotation/scaling etc information, so that the bulk of the information (the "boat" scene graph) is only stored once, but the information necessary to draw multiple copies in different places (position etc) is stored as often as necessary. This would look something like the following, for the same example with two boats:

Scene graph

To put this in more technical terms, your current approach is an N-ary tree: consider using a unidirectional acyclic graph instead2.


  1. Please excuse my (minor) abuse of UML diagrams.
  2. Interesting things can be achieved by relaxing the unidirectional and acyclic restraints (i.e. using a plain old unrestricted graph), but that's a discussion for another time.
share|improve this answer

I assume you're doing a top-down traversal of the scene graph, e.g. for frustum culling or similar. You just need to remember where you came from when descending into the instanced scene graph (the boat in your example). You can do this by maintaining a stack of the nodes from the root to the current node, pushing when you descend a level and popping when you ascend. That way the stack at any point contains a complete record of how you got to the current node. (This is assuming a depth-first traversal order, which is the most common, I think.)

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.