#1 11.04.2005 16:34:10

MexDelphi
ProMember
Ort: Göppingen
Registriert: 24.01.2005
Beiträge: 235
Web-Seite

Device erstellen mit .NET und Managed DX

Geschaft ... uff

also einige sachen sind schon etwas gewöhnungsbedürftig - vor allem nervt
das ständige aufpoppen einer nachricht von wegen nicht zugewiesener Instanz  oder so - aber wenn man das ignoriert, dann gehts smile

Also .. hier der code um mit delphi und einem VCL Projekt DX in die
Gänge zu bekommen - nur zu demozwecken - es werden keine Fehler abgefangen .. aber man bekommt was zu sehen smile

Code: delphi

unit unit2;

interface

uses
  windows, messages, sysutils, variants, classes, graphics, controls, forms,
  dialogs, microsoft.directx, microsoft.directx.direct3d, borland.vcl.stdctrls,
  system.componentmodel, borland.vcl.extctrls, system.drawing;


type
  tform2 = class(tform)
    procedure formshow(sender: tobject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure createdevice;
    procedure createvertexbuffer;
    procedure createmat;
    procedure creatematrices;
    procedure apponidle(sender: tobject; var done : boolean);
  end;

var
  form2   : tform2;
  pp      : presentparameters;
  devi    : device;
  vbuffer : vertexbuffer;

implementation

{$R *.nfm}

procedure tform2.formshow(sender: tobject);
begin
createdevice;
createvertexbuffer;
createmat;
creatematrices;
application.onidle := apponidle;
end;

procedure tform2.createdevice;
begin
// Present Parameter füllen
pp := presentparameters.create;
pp.windowed := true;
pp.swapeffect := swapeffect.discard;
pp.enableautodepthstencil := true;
pp.autodepthstencilformat := depthformat.d16;

// die Device erzeugen
devi := device.create(0, devicetype.hardware, intptr(form2.handle),
                      createflags.softwarevertexprocessing, [pp]);
end;

procedure tform2.createvertexbuffer;
var
  verts : system.&array;
  i     : integer;
begin
// Certexbuffer erzeugen
vbuffer := vertexbuffer.create(typeof(customvertex.positionnormal), 6, devi, usage.writeonly,
                               customvertex.positionnormal.format, pool.default);
// Vertexbuffe Locken
verts := vbuffer.lock(0,lockflags.none);
try
  // ein kleines Dreieck - liegt flach auf dem Boden - erzeugen (mit Normale)
  verts.setvalue(customvertex.positionnormal.create(
          vector3.create(0, 0, 0), vector3.create(0, 1, 0)), 0);
  verts.setvalue(customvertex.positionnormal.create(
          vector3.create(1, 0, 0), vector3.create(0, 1, 0)), 2);
  verts.setvalue(customvertex.positionnormal.create(
          vector3.create(0, 0, 1), vector3.create(0, 1, 0)), 4);

  finally
    vbuffer.unlock;
  end;
end;


procedure tform2.createmat;
var
  colo  : system.drawing.color;
  mtrl  : material;
begin
// Material
colo := system.drawing.color.white;
mtrl := microsoft.directx.direct3d.material.create;
mtrl.diffuse := colo;
mtrl.ambient := colo;
devi.material := mtrl;

// das Ambiente Licht - sonst sehnwernix :)
devi.renderstate.ambient :=  system.drawing.color.fromargb(255,255,255);

end;




procedure tform2.creatematrices;
begin
// eine kleine Rotation
devi.transform.world := matrix.rotationaxis(vector3.create(0,1,0),environment.tickcount / 3000.0 );

devi.transform.view := matrix.lookatlh(vector3.create( 0.0, 3.0,-5.0 ),
                                       vector3.create( 0.0, 0.0, 0.0),
                                       vector3.create( 0.0, 1.0, 0.0 ) );

devi.transform.projection := matrix.perspectivefovlh( math.pi / 4.0, 1.0, 1.0, 100.0);
end;



procedure tform2.apponidle(sender: tobject; var done : boolean);
begin
done := false;
//den backbuffer mit schwarz löschen
devi.clear(clearflags.target or clearflags.zbuffer, system.drawing.color.black, 1.0, 0);
//Begin the scene
devi.beginscene;
// Material zuweisen
createmat;
// world, view, and projection - Matrix setzen
creatematrices;

devi.setstreamsource(0, vbuffer, 0);
devi.vertexformat := customvertex.positionnormal.format;
devi.drawprimitives(primitivetype.trianglestrip, 0, 3);
//End the scene
devi.endscene;
// Update screen
devi.present;
end;

end.



also das: var   verts : System.&Array;
und das füllen via: verts.SetValue(...)

find ich praktisch smile


goto: http://mexdelphi.cybton.com

Offline

 

#2 11.04.2005 19:41:45

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Device erstellen mit .NET und Managed DX

Hab das Ganze mal hierher verschoben. Ist hier besser augehoben.


mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson