Einzelnen Beitrag anzeigen

Vitus

Registriert seit: 24. Apr 2003
Ort: Auckland, Neuseeland
38 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Direct3D - Kapselung der Routinen

  Alt 17. Feb 2004, 18:20
Nachdem mir bei meinem Problem bisher noch niemand helfen konnte hab ich mich mal alleine auf den steinigen Pfad begeben und angefangen ein paar Klassen zu schreiben. Und siehe da: ich stehe vor weiteren Problemen!

Ich habe jetzt eine Klasse Tlts2DObject mit folgender Deklaration:
Delphi-Quellcode:
type
Tlts2DObject = class(TObject)
  private
    D3DVertex: array [0..5] of TMyVertex;
    D3DTexture: IDIRECT3DTEXTURE9;
    DebugSchritt: Integer;
  public
    Left: Integer;
    Top: Integer;
    Width: Integer;
    Height: Integer;
    Layer: Integer;
    Color: dword;
    Angle: Real;
    Alpha: Integer;
    Graphic: String;
    procedure render(pD3DVertexBuffer: pIDirect3DVertexBuffer9;
                                pD3DDevice: pIDirect3DDevice9);
    procedure updateGeom();
    procedure DebugMsg(Text: String);
end;
Dabei sind pIDirect3DVertexBuffer9 und pIDirect3DDevice9 folgendermassen definiert:

Delphi-Quellcode:
type pIDirect3DDevice9 = ^IDirect3DDevice9;

type pIDirect3DVertexBuffer9 = ^IDirect3DVertexBuffer9;
Die Render Methode (der Übeltäter und Nagel zu meinem Sarg) sieht folgendermassen aus:
Delphi-Quellcode:
procedure Tlts2DObject.render(pD3DVertexBuffer: IDirect3DVertexBuffer9;
                                pD3DDevice: IDirect3DDevice9);
var
  vbVertices : pByte;
begin
   UpdateGeom(); //Anmerkung: hier wird die Geometrie des Objekts errechnet

 pD3DDevice^.SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1); //hier crash => Zugriff auf das Device per Pointer nicht möglich
  pD3DDevice^.SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
  pD3DDevice^.SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_DISABLE);
  pD3DDevice^.SetTextureStageState(0,D3DTSS_CONSTANT, D3DTEXF_LINEAR);
  pD3DDevice^.SetTextureStageState(0,D3DTSS_CONSTANT, D3DTEXF_LINEAR);

  D3DXCreateTextureFromFile(pD3DDevice^,pchar(Graphic),D3DTexture);

   if Alpha <> 255 then
      pD3DDevice^.SetRenderState( D3DRS_ALPHABLENDENABLE, 1 )
   else
      pD3DDevice^.SetRenderState( D3DRS_ALPHABLENDENABLE, 0 );

  pD3DDevice^.CreateVertexBuffer (sizeof(TMyVertex), D3DUSAGE_WRITEONLY,
                            D3D9T_CUSTOMVERTEX, D3DPOOL_MANAGED,
                            pD3DVertexBuffer^, nil);

   pD3DVertexBuffer^.Lock(0,0,pointer(vbVertices),D3DLOCK_NOOVERWRITE);
  Move(D3DVertex,vbVertices^,SizeOf(TltsSprite));
  pD3DVertexBuffer^.Unlock;

   pD3DDevice^.SetTexture( 0, D3DTexture );

  pD3DDevice^.SetFVF(D3D9T_CUSTOMVERTEX);

  pD3DDevice^.SetStreamSource(0,pD3DVertexBuffer^,0,sizeof(TMyVertex));

   pD3DDevice^.DrawPrimitive( D3DPT_TRIANGLELIST,0,2 );

end;
Ich lege nun von meinem Hauptprogramm aus ein neues Objekt vom Typ Tlts2DObject an:

Delphi-Quellcode:
  newWindowObject := Tlts2DObject.Create();
  newWindowObject.Width := frmMain.getResolution.Width;
  newWindowObject.Height := frmMain.getResolution.Height;
  newWindowObject.Left := 0;
  newWindowObject.Top := 0;
  newWindowObject.Layer := 1;
  newWindowObject.Color := $8000FF;
  newWindowObject.Angle := 0;
  newWindowObject.Alpha := 130;
  newWindowObject.Graphic := 'media\menumain.bmp';
Desweiteren initialisiere ich in meinem Hauptprogramm das Direct3DDevice mit allem drum und dran.

In meinem Hauptprogramm wird ausserdem die Szene begonnen und beendet (Damit meine ich BeginScene und EndScene). Dazwischen jedoch soll die render Methode meines neuen Objekts newWindowObject aufgerufen werden und genau da liegt das Problem!

Delphi-Quellcode:
  if assigned(D3DDevice) then
  begin
    D3DDevice.Clear(0,nil,D3DCLEAR_TARGET,D3DCOLOR_XRGB(100,100,100),1,0);

    if SUCCEEDED(D3DDevice.BeginScene) then
    begin
    //VertexListe erweitern
      SetLength(vblist, length(vblist)+1);
      newWindowObject.render(Pointer(vblist[0]),Pointer(D3DDevice));
      D3DDevice.EndScene;
    end;

   // Zeige Resultate auf dem Bildschirm
    D3DDevice.Present(nil,nil,0,nil);
  end;
end;
Beim Sprung in die render Methode des Objekts kommt eine Exception sobald ich das D3DDevice auch nur anfasse - die Zeile habe ich oben markiert.


Ich habe bisher noch nie wirklich mit Zeigern unter Delphi gearbeitet, ich kann mir vorstellen dass einem versierten Pointer-Nutzer der Fehler sofort auffällt - ich für meinen Teil bin wirklich ratlos.


jaaaaa! Gebt es mir

Lieber Gruß
Vitus
  Mit Zitat antworten Zitat