J'ai un arbre d'objets qui représente un modèle 3D (un graphe de scène). Les nœuds d'arbre sont de types différents (implémentés comme des classes dérivées d'une classe de base commune). Par exemple, il existe un nœud représentant un polygone ou un nœud qui applique une transformation de coordonnées (rotation, translation) à ses nœuds enfants. C'est aussi une exigence, que les fournisseurs tiers devraient être en mesure d'implémenter de nouveaux types de nœuds, et les ajouter par un plugin (j'utilise Qt comme framework GUI). Il est donc possible qu'il y ait des nœuds dans l'arbre, dont le type est inconnu lors de la compilation.Mise en œuvre d'un modèle MVC sur un graphe de scène C++
Maintenant je veux implémenter une classe, qui agit comme une vue pour ce graphe de scène. Pour chaque type de nœud d'arbre, la vue doit prendre les mesures appropriées (dessiner le polygone, transformer, etc.). Mon idée est d'implémenter des classes d'affichage pour chaque type de noeud et de laisser la classe de vue de niveau supérieur déléguer à ces classes en fonction du type de noeud. (Les fournisseurs tiers seront en mesure d'implémenter leurs propres classes de délégués de vue)
Donc, ma question est: comment puis-je déterminer le type d'un nœud d'une manière performante et extensible?
Mes idées à ce jour:
je pourrais ajouter un identifiant de type à chaque classe de noeud. Cela pourrait simplement être un entier (les chaînes ne conviennent pas pour des raisons de performances). Le problème est la gestion des identifiants de type pour les fournisseurs tiers. Comment puis-je m'assurer que le même identificateur n'est pas utilisé pour différents types de noeuds (par exemple par différents fournisseurs)?
Je pourrais implémenter le code de dessin, ou au moins un appel à l'objet délégué de dessin approprié directement dans le nœud. Mais les objets de mes noeuds ne devraient de préférence pas connaître leurs objets de vue. De même, il n'est pas possible de donner à chaque objet nœud un objet de vue dédié (on parle de dizaines de milliers de nœuds).
Alors, quelles sont vos idées? Y a-t-il peut-être une façon complètement différente de gérer cela? Rappelez-vous: la solution ne devrait PAS nécessiter de recherche de tables de hachage ou d'autres algorithmes à calcul intensif, car j'ai besoin de dessiner le graphique en temps réel.
Merci à l'avance, McNumber
Merci pour la réponse! Dans une sorte de jeu, ce serait parfaitement acceptable. Mais je dois développer une application 3D-CAD. L'arbre est utilisé pour stocker toutes les informations concernant les entités du modèle actuellement édité. En outre, le même arbre est utilisé pour des simulations, des tests et ainsi de suite. Avoir des arbres différents pour ces tâches serait inutile, car ils seraient pour la plupart identiques. Je veux explicitement séparer le modèle (peut-être un meilleur mot que le graphique de scène) et l'algorithme de dessin. – McNumber
En quoi pensez-vous que l'affichage et la simulation dans un jeu diffèrent de l'affichage et de la simulation dans un autre type d'application? – SingleNegationElimination
Je pense que la principale différence est la nécessité de manipuler le modèle à travers l'interface utilisateur. Cela signifie que je dois être capable de sélectionner quelque chose à l'écran et de changer son apparence. De plus, je dois dessiner le modèle de différentes manières, en fonction de l'état de l'application, de la sélection et de l'état du modèle. Par exemple, un objet sélectionné doit être mis en évidence d'une manière ou d'une autre. Alors j'ai pensé, il serait souhaitable d'avoir un objet modèle "stupide" qui est dessiné par un objet dans la couche de vue de mon application, parce que cet objet serait tout savoir sur l'état de l'application. – McNumber