Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engine)

Für allgemeine Fragen zur Programmierung mit PureBasic.
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engine)

Beitrag von smateja »

Hallo zusammen,

ich habe ein kleines Problem mit der Leadwerks-Engine und hoffe auf eure mithilfe - das Problem ist eigentlich auch schon in Delphi/Pascal gelößt - nur verstehe ich da die hälte der Syntax mal gleich garnicht.

Ziel ist es die Leadwerks-Engine (welche auch ohne Probleme unter PB läuft) in ein Image zu zeichnen um quasi die Engine in ein PB Windows Fenster Anwendung für einen kleinen Viewer etc. einzubinden.

Wenn ich das richtig gesehen habe wird ein "Custom Buffer" für die Leadwerks-Engine mit LE Syntax erstellt und dann dieser Buffer auf ein ImageGadget oder nur Image geschrieben:

Orginaler Code:


Code: Alles auswählen


unit uAppWin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, OpenGL, Leadwerks;

type
  TAppWin = class(TForm)
    RenderPanel: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
    procedure SceneCreate;
    procedure SceneUpdate;
    procedure SceneRender;
  public
    { Public declarations }
    function InitializeContexts (RenderCtrl:TWinControl) : boolean;
    procedure DestroyContexts;
  end;

var
  AppWin: TAppWin;

implementation

{$R *.dfm}

var
  pixelFormat      : integer;
  pfDescriptor     : TPixelFormatDescriptor;
  deviceContext    : HDC;
  renderingContext : HGLRC;
  renderingControl : TWinControl;

  BackBufferWnd, gWorldBuf, gLightBuf : THandle;
  gLight, gCamera, gMaterial, gPlane, gCube : THandle;

procedure CBufGetSize // callback for CreateCustombuffer
          ( var Width:Integer; var Height:Integer ); stdcall;
begin 
  Width := renderingControl.ClientWidth;
  Height := renderingControl.ClientHeight;
end;

procedure CBufMakeCurrent; stdcall; // callback for CreateCustombuffer
begin
  wglMakeCurrent(deviceContext, renderingContext);
end;

procedure TAppWin.FormCreate(Sender: TObject);
begin
  InitializeContexts (RenderPanel); // create render and device contexts
end;

procedure TAppWin.FormDestroy(Sender: TObject);
begin
  DestroyContexts; // destroy render and device contexts on form destroy
end;

procedure TAppWin.FormActivate(Sender: TObject);
begin
  SceneCreate; // create scene on form activate
end;

procedure TAppWin.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.OnIdle := nil; // detach render scene loop
  EndRender;
  FreeBuffer(gWorldBuf);     // free buffers
  FreeBuffer(gLightBuf);
  FreeBuffer(BackBufferWnd);
end;

function TAppWin.InitializeContexts (RenderCtrl:TWinControl) : boolean;
begin
  Result := False;
  FillChar(pfDescriptor, SizeOf(pfDescriptor), 0);
  with pfDescriptor do begin // Requested Pixel Format
    nSize      := SizeOf(pfDescriptor);
    nVersion   := 1;
    dwFlags    := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    iPixelType := PFD_TYPE_RGBA;
    cColorBits := 32;
    iLayerType := PFD_MAIN_PLANE;
  end;
  renderingControl := RenderCtrl;
  deviceContext := GetDC(renderingControl.Handle); // create device context
  if (deviceContext=0) then begin
    ShowMessage('Can''t create a device context.'); Exit;
  end;
  pixelFormat := ChoosePixelFormat(deviceContext, @pfDescriptor);
  if (pixelFormat=0) then begin
    ShowMessage('Can''t find a suitable pixel format.'); Exit;
  end;
  if not SetPixelFormat(deviceContext, pixelFormat, @pfDescriptor) then begin
    ShowMessage('Can''t set the pixel format : '+ IntToStr(pixelFormat));
  end;
  renderingContext := wglCreateContext(deviceContext); // create rendering context
  if (renderingContext=0) then begin
      ShowMessage ('Can''t create a rendering context.'); Exit;
  end;
  wglMakeCurrent(deviceContext, renderingContext);
  Result := True;
end;

procedure TAppWin.DestroyContexts;
begin
  if (renderingContext <> 0) then begin // delete rendering context
    wglMakeCurrent(0, 0); wglDeleteContext(renderingContext);
    renderingContext := 0;
  end;
  if (deviceContext <> 0) then begin // release device context
    ReleaseDC(Self.Handle, deviceContext); deviceContext := 0;
  end;
end;

procedure TAppWin.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
begin
  SceneUpdate; // update timing and physics
  SceneRender; // render scene and draw into custom buffer
  Done := False;
end;

procedure TAppWin.SceneCreate;
begin
  // Initialize
  CreateWorld;
  LoadFont('Arial');
  // DebugLights(1); DebugSceneGraph(1); DebugPhysics(1); DebugEntities(1);
  BackBufferWnd := CreateCustomBuffer(@CBufGetSize, @CBufMakeCurrent);
  SetBuffer (BackBufferWnd);
  // Create a camera
  gCamera := CreateCamera;
  CameraClearColor (gCamera,Vec4(0));
  PositionEntity (gCamera,Vec3(0,0,-6));
  // Load a material
  gMaterial:=LoadMaterial('scifi.mat');
  // Create plane
  gPlane  := CreateCube;
  ScaleEntity  (gPlane, Vec3(20,0.5,30) );
  MoveEntity   (gPlane, Vec3(0,-5,0)  );
  PaintEntity  (gPlane, gMaterial);
  // Create cube
  gCube := CreateCube;
  ScaleEntity  (gCube, Vec3(3) );
  PaintEntity  (gCube, gMaterial);
  // Create a spot light
  gLight  := CreateSpotLight(20);
  EntityColor(gLight,Vec4(1,1,1,1));
  MoveEntity   (gLight, Vec3(-1,2,-4));
  RotateEntity (gLight, Vec3(25,0,15));
  // Set ambient light
  AmbientLight(Vec3(0.2));
  // Startup on idle loop
  Application.OnIdle := ApplicationEventsIdle;
end;

procedure TAppWin.SceneUpdate;
begin
  TurnEntity(gCube, Vec3(0.25,0.5,1)); // Rotating cube
  UpdateAppTime; UpdateWorld(AppSpeed); // Update timing and physics
end;

procedure TAppWin.SceneRender;
var s : string;
    bWidth, bHeight : integer;
begin
  // Custom Back Buffer size - window may be resized in any time
  bWidth  := BufferWidth(BackBufferWnd);
  bHeight := BufferHeight(BackBufferWnd);
  // Render World into gWorldBuf
  if gWorldBuf<>0 then // Free render buffer if custom back buffer resized
    if ( BufferWidth(gWorldBuf)<>bWidth ) or ( BufferHeight(gWorldBuf)<>bHeight )
    then begin FreeBuffer (gWorldBuf); gWorldBuf := 0; end;
  if ( gWorldBuf=0 ) then // Create render buffer if needed
    gWorldBuf := CreateBuffer( bWidth, bHeight, BUFFER_COLOR or BUFFER_DEPTH or BUFFER_NORMAL);
  SetBuffer(gWorldBuf); // Make our render buffer the current buffer
  RenderWorld; // Render the world to the render buffer
  // Render Lights into gLightBuf
  if gLightBuf<>0 then // Free render buffer if custom back buffer resized
    if ( BufferWidth(gLightBuf)<>bWidth ) or ( BufferHeight(gLightBuf)<>bHeight )
    then begin FreeBuffer (gLightBuf); gLightBuf := 0; end;
  if ( gLightBuf=0 ) then // Create render buffer if needed
    gLightBuf := CreateBuffer( bWidth, bHeight, BUFFER_COLOR or BUFFER_DEPTH);
  SetBuffer(gLightBuf); // Make our render buffer the current buffer
  RenderLights(gWorldBuf); // Passing render buffer (color, depth, and normal data)
  // Draw final image into Custom Back Buffer and Flip
  SetBuffer(BackBufferWnd); // Make the custom back buffer the current buffer
  DrawImage( GetColorBuffer(gLightBuf,0), 0, bHeight, bWidth, -bHeight );
  // Write some infos
  s := Format('buffer size: %d x %d , fps: %d',
    [ BufferWidth(BackBufferWnd), BufferHeight(BackBufferWnd), Round(UPS) ]);
  DrawText (PChar(s),4,4); // Draw some info
  SwapBuffers (deviceContext); // Flip (custom buffer)
end;

end.


Wenn hier jemand das include der Leadwerks Engine braucht - das gibts hier:
http://www.redwalled.de/pb/hw_include_engine_3d.pbi

Plz Plz PLz help
PB 4.6 / 32 Bit / 64 Bit
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engin

Beitrag von dysti »

Dein Link funktioniert nicht
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Re: Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engin

Beitrag von smateja »

Jup, zudem hat man den link auf mein Header aus dem Forum entfernt - Josh von Leadwerks hat mich parallel auch auf der leadwerks site daraufhin angesprochen, dass ich somit gegen irgendwelche leadwerksbestimmungen verstoße und hat hier im forum diverse Links auf mein geistiges Eigentum hin löschen lassen.

Eigentlich sollte er ja froh sein, dass es leute gibt, die die Leadwerksengine mit Purebasic zusammen verwenden - aber hier im Forum ist es unmöglich support zu bekommen - zudem noch wenn man nicht mal seine eigenen header der Community zur Verfügung stellen darf - einen separaten bereich auf der leadwerksseite (Forum) um gezielter quasi auf PB Probleme und LEadwerks eingehen zu können gibts leider auch nicht.

ICh habe hierzu Josh auch schon mehrfach geschrieben - bislang auch noch keine reaktion - mal schauen - möglicherweise schmeiß ich meine investierten 199 € einfach in den müll da ohne irgendwie ein bisschen support das ganze doch sehr fda ist.
PB 4.6 / 32 Bit / 64 Bit
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Re: Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engin

Beitrag von real »

Soweit ich weiß gibt es einen PureBasic-Headergenerator zum Download auf der Leadwerks-Seite. Zu einem Beispiel für "CreateCustomBuffer()" würde ich eher im Leadwerks-Forum fragen als hier. Das Beispiel dazu im Wiki von Leadwerks ist ja leider auch nur ein toter Link.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engin

Beitrag von X0r »

Hab schon öfters gehört, dass dieser Josh dreist sein soll.
Wo ich jetzt auch mal deinen Delphi Code bzw. die Funktionen der Leadwerks-Engine sehe, muss ich sehr stark an die Blitz3D-Engine denken. <)
smateja
Beiträge: 250
Registriert: 25.11.2004 19:51
Computerausstattung: Alienware Aurora / Intel Core i7 CPU @ 2.8 GHz / 64 Bit OS

Re: Delphi in Purebasic Dolmetscher gesucht (Leadwerks Engin

Beitrag von smateja »

Jo das Prop ist - im LeadwerksForum bekommt man gleich 0 unerstützung wenn es um die Kombination Leadwerks und PB geht.

Aber ich knobel das schon noch raus rigendwie.

Thema Josh: Mhmm - weiß jetzt nicht wie ichs sagen soll ohne jemanden gelich auf die Füße zu treten - aber - ja etwas forsch ist schon ein richtiger Ansatz.
PB 4.6 / 32 Bit / 64 Bit
Antworten