Bonjour à tous!
Je viens solliciter votre avis sur la conception et le design d'un ensemble de classes, dans le but d'uniformiser l'utilisation d'APIs (DirectX et OpenGL, mais ça pourrait être autre chose).
Ci-dessous mes contraintes:
- Le choix de l'API est déterminé par à la compilation (et je pense que cela va jouer un grand rôle pour la suite!).
- La possibilité d'utiliser boost et c++11
- Les classes représentant une ressource côté GPU (typiquement texture, shader, framebuffer, etc), ne contiennent pas les opérations de traitement. En effet, elles se trouvent dans un autre ensemble de classes!
Donc on tombe sur le code suivant pour les ressources GPU, et les classes de traitements:
Cela concerne la gestion des APIs, mais par ailleurs dans le code j'ai par exemple une classe material, qui contient un shader, et se moque de savoir quelle API est utilisée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct shader {}; struct shader_ogl : public shader {}; struct shader_dx : public shader {}; struct renderer {}; struct renderer_ogl : public renderer {}; struct renderer_dx : public renderer {};
Donc naturellement je pensais me dirigé vers un double-dispatch, seulement voila:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class material { // Par exemple void addShader(const std::shared_ptr<shader> &s); };
- Ne perd t-il quelque peu de son intérêt du fait que l'API est choisit à la compilation
- D'après un article d'Emmanuel Deloget http://blog.emmanueldeloget.com/inde...comme-visiteur, il ne respecte pas l'OCP, et en cas de grosse hiérarchie, ça peut vite devenir compliqué.
Dans un contexte très similaire, sur un article de Laurent Gomilla http://loulou.developpez.com/tutorie.../partie8/#L4.3, ce dernier reçois dans ses renderer spécialisé des shader, auquel il applique un static_cast vers la bonne classe dérivée comme il est "sûr" de ce qu'il va recevoir.
Je me tourne donc vers vous pour connaître votre avis sur le choix de conception à employer (surtout que je connais l'API utilisé à la compilation!)!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void COGLRenderer::SetVertexShader(const IShaderBase* Shader) { const COGLShader* OGLShader = static_cast<const COGLShader*>(Shader); // Traitement ... }
Merci d'avance!
Partager