IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Problème de VB


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Par défaut Problème de VB
    Bonjour,
    Je suis en train de faire un "wrapper" (je sais pas si l'on peut appeler ça comme ça) autour de Direct3D9 et OpenGL en C++ pour pouvoir ensuite me faciliter la vie.
    Là je suis en train de faire des classes pour englober la gestion des vertex buffers (je verrai un peu plus tard pour les IB), en utilisant un système analogue à celui des FVF de Direct3D pour décrire la structure du vertex. Mais j'ai un problème avec ma classe gérant les vertes buffers Direct3D9, je ne sais pas trop où, je ne sais pas trop pourquoi (je pense que ça vient soit de AddVertices() ou Draw() voire le constructeur).

    Mon code (toute remarque pour l'améliorer est la bien venue ^^):

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include "ZDevice.hpp"
    #include "Device/D3D9VertexBuffer.hpp"
    ...
    #pragma pack(push)
    #pragma pack(1)
    struct Vertex
    {
    	float x, y, z;
    	float nx, ny, nz;
    	unsigned long color;
    	float ts, tu;
    };
    #pragma pack(pop)
    ...
    Vertex verticesArray[] = 
    	{
    		{ -0.75f, -0.75f, 0.0f,
    		  0.0f, 0.0f, 0.0f,
    		  COLOR_ARGB(255, 255, 0, 0),
    		  0.0f, 0.0f},
     
    		{ -0.75f, 0.75f, 0.0f,
    		   0.0f, 0.0f, 0.0f,
    		   COLOR_ARGB( 255, 0, 255, 0),
    		   0.0f, 0.0f},
     
    		{ 0.75f, 0.75f, 0.0f,
    		  0.0f, 0.0f, 0.0f,
    		  COLOR_ARGB(255, 0, 0, 255),
    		  0.0f, 0.0f},
     
    	};
     
     
    	D3D9VertexBuffer myBuffer(device, FVF_XYZ | FVF_NORMAL | FVF_DIFFUSE | FVF_TEX0,  ZVertexBuffer::Triangles, 2, 2);
    	myBuffer.AddVertices(verticesArray, 3);
     
    	while(!done)
    	{
    		while(device->GetEvent(Event))
    		{
    			if(Event.Type == Closed)
    			{
    				done = true;
    				break;
    			}
    		}
     
    		device->BeginScene();
     
    		myBuffer.Draw(0, 2);
     
     
    		device->EndScene();
    	}
    ZVertexBuffer.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #ifndef ZVERTEX_BUFFER_HPP_INCLUDED
    #define ZVERTEX_BUFFER_HPP_INCLUDED
     
    #define FVF_XYZ              0x01
    #define FVF_NORMAL           0x02
    #define FVF_DIFFUSE          0x04
    #define FVF_TEX0             0x08
    #define FVF_TEX1             0x10
    #define FVF_TEX2             0x20
    #define FVF_TEX3             0x40
    #define FVF_TEX4             0x80
    #define FVF_TEX5             0x100
    #define FVF_TEX6             0x400
    #define FVF_TEX7             0x800
    #define FVF_TEX8             0x1000
     
    class ZVertexBuffer
    {
    	public:
     
    		enum PrimitiveTopology{
    			Triangles,
    			TriangleStrip,
    			TriangleFan,
    			Lines,
    			LineStrip,
    			Points
    		};
     
    		ZVertexBuffer(ZDevice* device, PrimitiveTopology topo, unsigned int primitivesReservedFor, unsigned int reallocBy = 100);
    		virtual ~ZVertexBuffer();
     
     
    		virtual void AddVertices(void* vertices, unsigned int nbVertices) = 0;
    		...
     
    		virtual void Draw(unsigned int beginIndex, unsigned int nbPrimitivesToDraw) = 0;
     
    		...
    	protected:
     
    		unsigned int GetNbVerticesFromNbPrimitives(unsigned int nbPrimitives);//pour connaître le nombre de vertices nécessaire à la réalisation de nbPrimitives selon le type de primitive (m_topo)
    		unsigned int GetNbPrimitivesFromNbVertices(unsigned int nbVertices);//inverse
     
    		ZDevice* m_device;//
    		PrimitiveTopology m_topo;// primitvie utilisée pour le rendu
    		unsigned short m_structSize;//la taille de la structure en bits
    		unsigned int m_nbVertices, m_nbPrimitives, m_nbVerticesReservedFor, m_nbPrimitivesReservedFor, m_reallocBy;//nombre de vertices actuellement stockées dans le buffer, de primitives dans le buffer, nombre de primitives pour lesquelles ont a prévu la taille du buffer, pas en nombre de primitives par lequel on réalloue le buffer
    		bool m_emptyBuffer, m_readyBuffer;
    };
     
    #endif ZVERTEX_BUFFER_HPP_INCLUDED
    D3D9VertexBuffer.hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #ifndef D3D9VERTEX_BUFFER_HPP_INCLUDED
    #define D3D9VERTEX_BUFFER_HPP_INCLUDED
     
    #include "D3D9Device.hpp"
    #include "../ZVertexBuffer.hpp"
     
    class D3D9VertexBuffer: public ZVertexBuffer
    {
    	public:
     
    		D3D9VertexBuffer(ZDevice* device,unsigned long FVF = FVF_XYZ, PrimitiveTopology type  = Triangles, unsigned int primitivesReservedFor = 100, unsigned int reallocBy = 100);
                    ...
     
    		void AddVertices(void* vertices, unsigned int nbVertices);
                    .......
    		void Draw(unsigned int beginIndex, unsigned int nbPrimitivesToDraw);
     
    		...
     
    	protected:
     
    		int m_FVF;// le FVF 'DirectX' utilisé par le buffer
    		D3DPRIMITIVETYPE m_topology;
    		IDirect3DDevice9* m_d3d9Device;
    		IDirect3DVertexBuffer9* m_vertexBuffer;
    };
    D3D9VertexBuffer.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include "D3D9VertexBuffer.hpp"
     
    D3D9VertexBuffer::D3D9VertexBuffer(ZDevice* device,unsigned long FVF, ZVertexBuffer::PrimitiveTopology type, unsigned int primitivesReservedFor, unsigned int reallocBy):
     ZVertexBuffer(device, type, primitivesReservedFor, reallocBy),
     m_vertexBuffer(0),
     m_FVF(0)
    {
    	//...
            //création du buffer
            // m_readyBuffer == true si tout s'est bien passé
    }
     
    void D3D9VertexBuffer::AddVertices(void* vertices, unsigned int nbVertices)
    {
    	 if( m_readyBuffer)
    	 {
     
    		if(m_nbVertices + nbVertices > m_nbVerticesReservedFor)
    			ReallocBuffer( (m_nbVertices + nbVertices) > (m_nbVerticesReservedFor + m_reallocBy) ?
    							(m_nbVertices + nbVertices) :
    							(m_nbVerticesReservedFor + m_reallocBy) );
     
    		 void* pVertexDest;
    		 m_vertexBuffer->Lock( m_nbVertices * m_structSize, nbVertices * m_structSize, &pVertexDest, 0);
    		 memcpy(pVertexDest, vertices, nbVertices * m_structSize);
    		 m_vertexBuffer->Unlock();
     
    		 m_nbVertices += nbVertices;
    		 m_nbPrimitives = GetNbPrimitivesFromNbVertices(m_nbVertices);
    		 m_emptyBuffer = false;
    	 }
    }
     
     
     
    void D3D9VertexBuffer::Draw(unsigned int beginIndex, unsigned int nbPrimitivesToDraw)
    {
    	 if( !m_emptyBuffer)
    	 {
    		 int nbVerticesToDraw = GetNbVerticesFromNbPrimitives(nbPrimitivesToDraw);
    		if( beginIndex + nbVerticesToDraw +1 > m_nbVertices)
    			nbVerticesToDraw = m_nbVertices - beginIndex;
    		 m_d3d9Device->SetStreamSource(0, m_vertexBuffer, 0, m_structSize);
    		 m_d3d9Device->SetFVF(m_FVF);
    		 m_d3d9Device->DrawPrimitive(m_topology, beginIndex, nbPrimitivesToDraw);
    	 }
    }
    Voilà, c'est pas grand chose, mais ça ne fonctionne pas...
    Si vous pouviez m'aider, merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Il y a 3 tonnes de code et peu de temps pour tester. Qu'est-ce qui ne fonctionne pas ?
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 217
    Par défaut
    Le Draw ou l'AddVertices je pense mais je ne vois pas du tout pourquoi...
    Je vais éditer pour enlever du code pour simplifier.

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo