- Procedure SIRD_Rand(x1,y1,x2,y2 : Integer);
- Var lookL : Array[0..maxwidth-1] of Integer;
- color : Array[0..maxwidth-1] of Byte;
- obsDist : Integer;
- eyeSep : Integer;
- featureZ: Integer;
- sep : Integer;
- x,y : Integer;
- left,right : Integer;
- rest : LongInt;
- Begin
- obsDist := xdpi*12;
- eyeSep := Trunc(xdpi*2.5);
- >> alle Scanlines durchgehen
- for y:=y1 to y2 do Begin
- >> Pixelindizes für beide Augen vorinitialisieren
- for x:=x1 to x2 do
- lookL[x] := x;
- >> je nach Z-Wert Pixelposition für ein (in diesm Fall das linke) Auge verschieben (sep ist die berechnete Verschiebebreite)
- for x:=x1 to x2 do Begin
- featureZ := pWordArray(_SCREEN_ZBUFFER[y])^[x];
- sep := LongDiv(LongMult(eyeSep, featureZ), featureZ+obsDist, rest);
- left := x - sep shr 1;
- right := left + sep;
- >> pixel clippen, wenn in Fenster neue Koordinate übernehmen
- if (left>=x1) and (right<=x2) then
- lookL[right] := left;
- End;
- >> wenn ein x-Wert ein zu verschiebendes Pixel beinhält (d.h. der Inhalt von lookL ist ungleich dem vorinitialisierten Wert), wird das entsprechende Pixel verschoben, ansonsten wird ein zufälliger Farbwert gewählt (8 Bit)
- for x:=x1 to x2 do Begin
- if lookL[x]=x then
- >> anstatt einer Zufallszahl kann auch ein Pixel aus einem Bitmap genommen werden, allerdings schaut das komisch aus, wenn nicht (siehe unten)
- color[x] := Random(256) { unconstrained }
- else
- color[x] := color[lookL[x]]; { constrained }
- End;
- >> Farbwerte auf Bildschirm (war bei mir ein memory mapped offscreen buffer, der aber z.B. im Mode 13 direkt im VRam liegen konnte, daher schreibe ich nur größere Mengen an Daten auf einmal rein (theoretisch hätte ich das Color Array auch sparen können
- MoveD(color[x1], pByteArray(_SCREEN_BUFFER[y])^[x1], x2-x1);
- End; { for y }
- End;