A part of my game asset manager are divided into 3 layers.
1. Loader (Opengl-related) : MeshInternal, TextureInternal
A manager will ensure that 1 filename will be loaded only once.
2. Handle : MeshPtr , TexturePtr
This can be stored in game logic, and can be used in Material.
Each instance can be duplicated and can be stored by game logic.
They are just pointers to .
//game logic MeshPtr meshptr=meshManager()->get(ROCKET_MESH);
3. 3D Material (Material)
It contained a fix amount of textures (e.g. lambertian, specular, emit, ...) and some tweaked color values (e.g. lambertian color multiplier).
It is stored by value, because each instance of in-game 3D-object may duplicated it and customize it to match its unique attribute (e.g. red=low HP).
Game logic will cache it by value.
//game logic Material mat=material()->mat_ROCKET; //shallow copy work well //can also be called using enum
Although everything work really good, my fear arise.
I store  by value. It means I stored  in term of pointer. I store  &  by value.
I think it is inconsistent, especially when I look at example code in & above.
How to professionally avoid this type of inconsistency?
... or is it the correct way to go?
Are there any disadvantage/limitation of this design?