Конференция "Игры" » Заполнение буфера вершин [Delphi, Windows]
 
  • Evolite (07.01.09 18:39) [0]
    Всем привет!
    Возникла непонятная проблема: хочу заполнить буфер вершин используя динамический массив, каждый элемент массива-это структура содержащая координаты точки , ее цвет и размер.Но происходит что то совсем не похожее на должный результат.Вот код :

    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
       { Private declarations }
     public
       { Public declarations }
     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

    {$R *.dfm}

    { TMainForm }

    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.


    Если использовать не динамический массив тогда все нормально.
    Если кто знает в чем загвоздка пожалуйста подскажите.
    Заранее спасибо!
  • @!!ex © (07.01.09 19:09) [1]
    Динамический массив(в отличии от обычного) это указатель специального вида, а не на данные.
    Поэтому в качестве адреса наде передавать не указатель на массив, а указатель на нулевой элемент.
  • @!!ex © (07.01.09 19:10) [2]
    тоесть:
    move(VertexList[0],pBuf^,sizeof(sVertex)*MAX_VERTICES);
  • Evolite (07.01.09 19:37) [3]
    Спасибо @!!ex! Очень помог!
 
Конференция "Игры" » Заполнение буфера вершин [Delphi, Windows]
Есть новые Нет новых   [134430   +2][b:0][p:0.002]