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.