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
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
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(); }
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
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.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 #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; };
Voilà, c'est pas grand chose, mais ça ne fonctionne pas...
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); } }
Si vous pouviez m'aider, merci.
Partager