PDA

Voir la version complète : une seule declaration de device pour tout le programme


Mickael
25/10/2005, 01h15
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

Ruffi
25/10/2005, 01h35
un chtit singleton ?

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.

Loulou
25/10/2005, 17h18
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.

HanLee
25/10/2005, 22h47
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.

Mickael
28/10/2005, 00h34
C'est bon ca work j'ai tout mis dans une class comme a dit Loulou

HanLee
28/10/2005, 01h55
Explique ;)

Mickael
28/10/2005, 12h08
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

Loulou
28/10/2005, 12h26
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.

Mickael
28/10/2005, 13h00
Erreur de vocabulaire surement :)

par exemple d3dx9.lib n'a que 1 .h !

Comment faire comme ca ?

Mickael

Loulou
29/10/2005, 13h25
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.

HanLee
29/10/2005, 21h54
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.