Проблема создания системы координат xyz с DX UT DirectX9
Здравствуйте, я на самом деле пытаюсь создать систему координат xyz с помощью DX UT, но линии не отображаются на экране.
Я использую следующую структуру для хранения данных вершин.
// Struct for vertex
struct s_custom_vertex
{
// Position
FLOAT x, y, z, rhw;
// Current color
DWORD color;
public:
// Default constructor
s_custom_vertex() = default;
// Constructor that sets value
s_custom_vertex(FLOAT _x,FLOAT _y, FLOAT _z,FLOAT _rhw,DWORD _color):
x(_x),y(_y),z(_z),rhw(_rhw),color(_color){}
};
extern LPDIRECT3DVERTEXBUFFER9 g_pVB;
И создал еще один класс, который содержит указатель на массив этой структуры. ЗАГОЛОВОК ФАЙЛА
using Custom_vertex_arr = std::array< s_custom_vertex*, MAX_LINE_COUNT>;
// Class that manages the graph
class XYZ_pos_graph
{
private:
// My custom vertex array
Custom_vertex_arr m_custom_vertex_arr;
public:
// Constructor
XYZ_pos_graph();
// Destructor
~XYZ_pos_graph();
public:
// Get m_custom_vertex_arr
Custom_vertex_arr Get_custom_vertex_arr();
// Initialize values
void Init_values();
};
CPP ФАЙЛ
XYZ_pos_graph::XYZ_pos_graph()
{
Init_values();
}
XYZ_pos_graph::~XYZ_pos_graph()
{
// Exception
if (m_custom_vertex_arr.data())
{
for (size_t i = 0; i < MAX_LINE_COUNT; i++)
{
delete m_custom_vertex_arr[i];
}
}
}
Custom_vertex_arr XYZ_pos_graph::Get_custom_vertex_arr()
{
return m_custom_vertex_arr;
}
void XYZ_pos_graph::Init_values()
{
// Red color line, pos X
m_custom_vertex_arr[0] = new s_custom_vertex(-100.f, 0.f, 0.f, 1.f, 0xffff0000);
// Green color line, pos Y
m_custom_vertex_arr[1] = new s_custom_vertex(0.f, 100.f, 0.f, 1.f, 0xff0000ff);
// Blue color line, pos Z
m_custom_vertex_arr[2] = new s_custom_vertex(0.f, 0.f, 100.f, 1.f, 0xff00ff00);
}
И DX UT
HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc,
void* pUserContext )
{
// Create vertex buffer
if (FAILED(pd3dDevice->CreateVertexBuffer(MAX_LINE_COUNT * sizeof(XYZ_pos_graph),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL)))
return E_FAIL;
// Instantiate pointer to XYZ_pos_graph
XYZ_pos_graph* pos_graph_ptr = new XYZ_pos_graph();
// Lock, set values then unlock
VOID* vertices_ptr;
if (FAILED(g_pVB->Lock(0, sizeof(pos_graph_ptr->Get_custom_vertex_arr()), static_cast<void**>(&vertices_ptr), 0)))
return E_FAIL;
memcpy(vertices_ptr, static_cast<VOID*>(pos_graph_ptr->Get_custom_vertex_arr().data()), sizeof(pos_graph_ptr->Get_custom_vertex_arr()));
g_pVB->Unlock();
delete pos_graph_ptr;
return S_OK;
}
void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
HRESULT hr;
// Clear the render target and the zbuffer
V( pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB( 0, 255, 255, 255 ), 1.0f, 0 ) );
// Render the scene
if( SUCCEEDED( pd3dDevice->BeginScene() ) )
{
pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(XYZ_pos_graph));
pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pd3dDevice->DrawPrimitive(D3DPRIMITIVETYPE::D3DPT_LINESTRIP, 0, MAX_LINE_COUNT);
V( pd3dDevice->EndScene() );
}
}
Что могло быть не так? Заранее спасибо.