Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   OpenGL Panel in Firemonkey (https://www.delphipraxis.net/181502-opengl-panel-firemonkey.html)

Peter666 20. Aug 2014 13:53

OpenGL Panel in Firemonkey
 
Hi,

hat jemand eine Idee wie ich ein OpenGL Panel in einem Firemonkey Formular erstellen kann? Unter VCL reicht es ein TPanel Wincontrol zu erstellen und das Handle von da zu nehmen. Das geht ja unter FMX nicht und ich bräuchte das für Android, Mac und Windows.

Peter

mkinzler 20. Aug 2014 14:10

AW: OpenGL Panel in Firemonkey
 
Schau Dir mal die Beispiele hier an. Beim Demo TestBed Es wird per OpenGL(ES) auf dem Canvas eines Panels gezeichnet.

https://github.com/FMXExpress/box2d-firemonkey

Peter666 27. Aug 2014 12:11

AW: OpenGL Panel in Firemonkey
 
Sorry dass ich mich jetzt erst melde. Also unter Windows und Mac hab ich das recht leicht hinbekommen:
Code:
  FillChar(WindowClass, SizeOf(WindowClass), 0);
    WindowClass.Style := CS_HREDRAW or CS_VREDRAW;
    WindowClass.lpfnWndProc := @DefWindowProc;
    WindowClass.cbClsExtra := 0;
    WindowClass.cbWndExtra := 0;
    WindowClass.hInstance := hInstance;
    WindowClass.hCursor := LoadCursorW(0, PChar(IDC_ARROW));
    WindowClass.hbrBackground := GetStockObject(NULL_BRUSH);
    WindowClass.lpszMenuName := nil;
    WindowClass.lpszClassName := PChar('OpenGLWindow');
    if Winapi.Windows.RegisterClass(WindowClass) = 0 then
      RaiseLastOSError;
  end;
  FWnd := CreateWindowEx(0, WindowClass.lpszClassName, nil, WS_CHILDWINDOW, 0,
    0, 0, 0, GetDesktopWindow, 0, hInstance, nil);
  ShowWindow(FWnd, SW_HIDE);
bzw.

Code:
  FView := TNSView.Create;
  FView := TNSView.Wrap(FView.initWithFrame(MakeNSRect(0, 0, 0, 0)));
  FView.setHidden(true);
Verändert man die Größe der Komponente passe ich einfach das Subview an bzw. das Fenster. Ich glaube das macht der Mediaplayer in Firemonkey auch so.
Woran ich scheitere ist das selbe unter GLES zu machen. Theoretisch sollte ich doch durch einfaches Zeichnen mit GLES Kommandos unter Android und iOS ja auch etwas rendern können, oder?

Mein Code zum zeichnen schaut so aus:
Code:
procedure TForm1.DoRenderScene;
const
  vcolors: array [0 .. 11] of Single = (0.0, 1.0, 0.0, 0.5, 1.0, 0.0, 0.0, 0.5,
    0.0, 0.0, 1.0, 0.5);
var
  x, y: Single;
  i: integer;
  q3: array [0 .. 3] of record x, y, z: Single;
end;
begin
  FAngle := FAngle + 1;
{$IFDEF CPUARM}
  glEnableClientState(GL_VERTEX_ARRAY);
  for i := 0 to 2 do
  begin
    q3[i].x := cos((FAngle + 120 * i) * PI / 180);
    q3[i].y := sin((FAngle + 120 * i) * PI / 180);
    q3[i].z := 0;
  end;
  glVertexPointer(3, GL_FLOAT, 0, @q3[0]);
  glTexCoordPointer(4, GL_FLOAT, 0, @vcolors[0]);
  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  glDisableClientState(GL_VERTEX_ARRAY);
{$ELSE}
  glBegin(GL_TRIANGLES);
  for i := 0 to 2 do
  begin
    x := cos((FAngle + 120 * i) * PI / 180);
    y := sin((FAngle + 120 * i) * PI / 180);
    glVertex2F(x, y);
    glColor4F(vcolors[i * 4 + 0], vcolors[i * 4 + 1], vcolors[i * 4 + 2],
      vcolors[i * 4 + 3]);
  end;
  glEnd();
{$ENDIF}
  glFlush();
  // ---------------------------------------------------------------------------
end;
Peter


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz