Всем привет!
Возникла непонятная проблема: хочу заполнить буфер вершин используя динамический массив, каждый элемент массива-это структура содержащая координаты точки , ее цвет и размер.Но происходит что то совсем не похожее на должный результат.Вот код :
unit MotionPointUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Direct3D9,D3DX9, ExtCtrls;
type
sVertex = record
x,y,z,rwh,size : Single;
color : DWORD;
end;
type
TMainForm = class(TForm)
Timer1: TTimer;
function DXInit : Hresult;
procedure DrawPoint;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
const
MAX_VERTICES = 10000;
var
MainForm: TMainForm;
ppiD3D9 : IDirect3D9 = nil;
ppiD3DDevice9 : IDirect3DDevice9 = nil;
vBuffer : IDirect3DVertexBuffer9 = nil;
iWidth,iHeight : Integer;
Rect : TRect;
VertexList : array of sVertex;
implementation
procedure TMainForm.DrawPoint;
var
hRes : HRESULT;
pBuf : Pointer;
D3DViewPort : TD3DviewPort9;
i : Integer;
begin
ppiD3DDevice9.GetViewport(D3DViewPort);
for i:= 0 to MAX_VERTICES - 1 do
begin
VertexList[i].x:=Random(D3DViewPort.Width);
vertexList[i].y:=Random(D3DViewport.Height);
VertexList[i].rwh:=1;
VertexList[i].size:= Random(2) + 1;;
VertexList[i].color:=Random($00FFFFFF);
end;
hRes:=ppiD3DDevice9.CreateVertexBuffer(sizeof(sVertex)*MAX_VERTICES,D3DUSAGE_WRI TEONLY,
D3DFVF_PSIZE or D3DFVF_XYZRHW or D3DFVF_DIFFUSE,
D3DPOOL_DEFAULT,vBuffer,nil);
if FAILED(hRes) then exit;
hres:=vBuffer.Lock(0,sizeof(sVertex)*MAX_VERTICES,pBuf,0);
if FAILED(hRes) then exit;
move(VertexList,pBuf^,sizeof(sVertex)*MAX_VERTICES);
vBuffer.Unlock;
end;
function TMainForm.DXInit: Hresult;
var
d3dpp : TD3DPresentParameters;
hRes : HRESULT;
begin
Result:=E_FAIL;
ppiD3D9:=Direct3DCreate9(D3D_SDK_VERSION);
ZeroMemory(@d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth:=iWidth;
d3dpp.BackBufferHeight:=iHeight;
d3dpp.BackBufferFormat:=D3DFMT_R5G6B5;
d3dpp.SwapEffect:=D3DSWAPEFFECT_FLIP;
d3dpp.Windowed:=False;
d3dpp.FullScreen_RefreshRateInHz:=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval:=D3DPRESENT_INTERVAL_DEFAULT;
hRes:=ppiD3D9.CreateDevice(D3DAdapter_DEFAULT,D3DDEVTYPE_HAL,MainForm.Handle,
D3DCREATE_MIXED_VERTEXPROCESSING,@d3dpp,ppiD3DDevice9);
if FAILED(hRes) then exit;
Result:=hRes;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Randomize;
SetLength(VertexList,Max_Vertices);
iWidth:=800;
iHeight:=600;
SetRect(Rect,0,0,iWidth,iHeight);
DXInit;
end;
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
ppiD3DDevice9.Clear(1,@Rect,D3DClear_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0);
ppiD3DDevice9.BeginScene;
ppiD3DDevice9.SetStreamSource(0,vBuffer,0,sizeof(sVertex)*MAX_VERTICES);
ppiD3DDevice9.SetFVF(D3DFVF_PSIZE or D3DFVF_XYZRHW or D3DFVF_DIFFUSE);
DrawPoint;
ppiD3DDevice9.DrawPrimitive(D3DPT_PointList,0,MAX_VERTICES);
ppiD3DDevice9.EndScene;
ppiD3DDevice9.Present(nil,nil,MainForm.Handle,nil);
end;
end.
Если использовать не динамический массив тогда все нормально.
Если кто знает в чем загвоздка пожалуйста подскажите.
Заранее спасибо!