A render queue (I assume this is what you meant) is not just a list of objects that need to be rendered. It is a list of object parts that have survived the culling phase and are to be sorted (the job of the render queue itself).
I suggest you stick to what is most logical in terms of component interactions and avoid terms that are too abstract in either name or functionality.
For example, what is a “render module”? What should it contain or do? It is very abstract, and it sounds as though it is going to lead to tight coupling between certain modules that do not need to be coupled. For example, it seems to be heading in the direction where the graphics module knows what a model is when it should be entirely the other way around.
The same holds for “DataPackage”. What is it? What does it contain or do?
What you describe it as being is a monolithic container of all kinds of data for all kinds of objects, which again is just inviting a tightly coupled design and unnecessary dependencies.
You are thinking more from a top-down approach.
Why not try a bottom-up approach?
A foundation layer provides typedefs and things you need throughout the engine. Optimized string compares etc., if you want. A timer class. A random number generator. Things you know you will need and depend on nothing else.
Then build a graphics layer on top which at first is just a wrapper for graphics functionality. Wrappers for state commands, vertex buffers, textures, etc.
Maybe it will later do more (such as render queues), but don’t confuse yourself by getting ahead of yourself.
Next up (and remember, each “step up” means the upper layers know about the lower ones but not the other way around) you have a model module which knows what graphics commands and vertex buffers are. The graphics module on the other hand does not know what a model is. At the same level you would have terrain.
This illustrates perfectly the point that the way in which a model renders itself and how GeoClipmap terrain renders itself are totally different, and far too monolithic to be held and managed by one module (the graphics module in your case).
Giving objects the ability to render themselves using a graphics module as a simple tool for doing so ensures you can add any kind of object, from models and imposters to water and GeoMipmap/GeoClipmap terrain. Each type of object can be self-contained within its own module without the need to create a mega-structure such as DataPackage to handle all possible sets of data.
Above that, the primary game-engine module knows about all of these things and inside it there exists a “scene” or “3DSceneManager” and “2DSceneManager”, as well as instances of models and things that can be scattered around the world.
The manager of the scene knows how to partition objects for efficient culling and collision detection, and it knows how to do rendering passes over the objects, or rather orchestrate the overall rendering pipeline while still letting each object handle its own rendering.
The scene manager culls objects, puts them into multiple render queues, sorts opaque and alpha render queues separately, sorts the render queues for shadow-casting lights separately, etc., and basically pulls all the things that need to be to pulled to make everything render in a happy tree friends way.
L. Spiro