Voir la version complète : une seule declaration de device pour tout le programme
Bonjour,
Je voudrais faire que mon programme n'ai qu'une seule declaration de device (LPDIRECT3DDEVICE9*) :00000023: .
en clair ne pas faire en fonction a chaque fois le device ( void truc( LPDIRECT3DDEVICE9* device ); ).
Un ami un moi m'a dit met en statique.
Ok je vois un peux pourquoi (::device).
Mais bon où la mettre pour que ca sois pas la merde ? j'ai entendu que les variables globale c'est pas le bon choix ( loulou ! :) ) mais où mettre cette declaration donc pour que ca sois bien placé ? :)
Merci de vos réponses
Mickael
grob1212
25/10/2005, 10h34
C'est vraiment tant un problème que de passer le device en paramètre ?
ShadowTzu
25/10/2005, 16h50
le problème est du coté utilisteur afin de ne pas lui permetre d'avoir accès au device mais de plutot passé par une interface, pour, par exemple, mieux optimiser les changements d'états.
Personnellement, j'encapsule toujours tout ce qui utilise le device (on peut voir ça comme les fonctionnalités D3D de base) dans une seule et même classe, qui a donc le device en donnée membre. Ainsi, inutile d'y accéder ailleurs.
C'est pas forcément "le design qui tue", mais ça me paraît mieux d'un point de vue OO.
Oui mais en fait, comment tu fais pour faire des rendus si tu peux pas y accéder ? Tu lui envoies des vertex buffers, index buffers et après tu lui dis de dessiner à partir de ça ?
J'trouve que c'est bizarre à utiliser. Par exemple si j'fais une classe de heightmap, je devrais utiliser ta classe spéciale pour générer le vertex buffer, index buffer, et pour faire le rendu ?
Dans ce cas, pourquoi ne pas avoir un double du device pour chaque classe qui fait du rendu (ou alors le passer en paramètre à chaque fois, ça dépend des préférences) ?
Faut dire que le device c'est quand même une interface à la base ;).
Bon c'est ptet pas très OO, mais je sais pas.
C'est bon ca work j'ai tout mis dans une class comme a dit Loulou
J'ai fais une class Renderer qui contient LPDIRECT3DDEVICE9* device comme membre privé.
La class Renderer est biensur un singleton.
La class Renderer contient une grande liste de fonction, si j'en ai oublier je le rajoute dedans (dans Renderer) et non dans le code direct du moteur !
De cette maniere, l'utilisateur est dans l'obligation, si le besoin est, d'utilisé renderer pour appeler des fonctions de device.
EXEMPLE:
Renderer.BeginScene();
Renderer.EndScene();
Je suis actuellement de programmer un moteur 3D qui utilise Directx et c++.
Je penses que des screenshot vont bientot apparaitre :D
Bon dans le meme sujet j'ai une question :
Mon moteur est une seule dll + une lib (dll + lib version debug et release) mais je voudrais savoir si je voudrais le distribué sans les sources comment faire.
Car la pour faire par exemple une fenetre je dois importer 2 includes de mon moteur.
Dois-je juste donner les .h sans les .cpp ?
J'ai entendu parlé de lib precompilé, comment ca marche ?
Mickael
Dois-je juste donner les .h sans les .cpp ?
Oui, c'est le principe. Fournir les en-têtes est un minimum, afin que le compilo sache ce qu'il manipule. Après tu n'es pas obligé de fournir le code source, celui-ci étant compilé et fourni via la DLL.
J'ai entendu parlé de lib precompilé, comment ca marche ?
Tu dois faire une erreur de vocabulaire, une bibliothèque étant toujours compilée.
Erreur de vocabulaire surement :)
par exemple d3dx9.lib n'a que 1 .h !
Comment faire comme ca ?
Mickael
par exemple d3dx9.lib n'a que 1 .h !
Comment faire comme ca ?
Pas trop, non. Y a qu'à regarder le début de d3dx9.h :
// Includes
#include "d3d9.h"
#include "d3dx9math.h"
#include "d3dx9core.h"
#include "d3dx9xof.h"
#include "d3dx9mesh.h"
#include "d3dx9shader.h"
#include "d3dx9effect.h"
#include "d3dx9tex.h"
#include "d3dx9shape.h"
#include "d3dx9anim.h"
Mais tu ne devrais pas te poser ce genre de question, livrer 1 ou 20 en-têtes n'est pas un problème.
J'ai fais une class Renderer qui contient LPDIRECT3DDEVICE9* device comme membre privé.
La class Renderer est biensur un singleton.
La class Renderer contient une grande liste de fonction, si j'en ai oublier je le rajoute dedans (dans Renderer) et non dans le code direct du moteur !
De cette maniere, l'utilisateur est dans l'obligation, si le besoin est, d'utilisé renderer pour appeler des fonctions de device.
EXEMPLE:
Renderer.BeginScene();
Renderer.EndScene();
Ah oui ok, et donc pour créer un VB et un IB tu passes par Renderer aussi ?
C'est un peu lourd, parce que le Device est en fait un objet déjà :) mais bon, si c'est pour en faire un singleton pourquoi pas.
vBulletin® v.3.6.5, Copyright ©2000-2009, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org