Einzelnen Beitrag anzeigen

LexLing

Registriert seit: 3. Mär 2014
15 Beiträge
 
Delphi XE5 Professional
 
#12

AW: Firemonkey Image3D Rendering Reihenfolge

  Alt 7. Mär 2014, 14:29
So, Problem gelöst
Ich habe die TViewport3D Komponente einfach kopiert und angepasst.
Komischerweise wurde die sort-Funktion dort nicht verwendet, was alle Probleme lösen würde.

Eine eigene Prozedur für den neuen Viewport (TGameScene), die die Möglichkeit bietet sich selbst zu aktualisieren, sollte da helfen.
Delphi-Quellcode:
procedure TGameScene.update;
var
  comp: TRenderingComp;
begin
  comp := TRenderingComp.Create;
  try
    FRenderingList.Sort(comp);
  finally
    comp.Free;
  end;

  Self.Repaint;
end;
Delphi-Quellcode:
TRenderingComp = class(TComparer<TControl3D>)
  public
    function Compare(const Left, Right: TControl3D): Integer; override;
end;
Und nun kommt die eigentliche Sortierung.
Delphi-Quellcode:
function TRenderingComp.Compare(const Left, Right: TControl3D): Integer;
begin
  // Zuerst kommen alle Elemente mit kleinerem Tag
  if left.Tag < right.Tag then
  begin
    Result := -1;
    exit;
  end
  else if left.Tag > right.Tag then
  begin
    Result := 1;
    exit;
  end;

  // Haben 2 Elemente den selben Tag, dann entscheidet die Z-Position
  if left.Position.Z > right.Position.Z then
    Result := 1
  else if left.Position.Z < right.Position.Z then
    Result := -1
  else if left.Position.X > right.Position.X then
    Result := 1
  else if left.Position.X < right.Position.X then
    Result := -1
  else
    Result := 0; // gleiche X und Z-Koordinaten
end;
Ich habe hier nach der z-Reihenfolge sortiert, weil in meinem Fall am wichtigsten ist.
Spezielle TImage3D Objekte, wie der "Untergrund" bekommen von mir einen negativen Tag mitgegeben, damit meine Compare-Funktion diese bevorzugt.
  Mit Zitat antworten Zitat