Einzelnen Beitrag anzeigen

Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#3

AW: OpenGL Panel in Firemonkey

  Alt 27. Aug 2014, 13:11
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
  Mit Zitat antworten Zitat