291 lines
No EOL
6.6 KiB
ObjectPascal
291 lines
No EOL
6.6 KiB
ObjectPascal
program mmmmmmmmmmmmm;
|
|
{$X+}
|
|
uses Crt,Vga13h,RayShade;
|
|
|
|
type
|
|
TgaHeader = record { 18 bytes total }
|
|
who_knows: array[1..12] of Byte;
|
|
Width: Word;
|
|
Height: Word;
|
|
BitsPerPixel: Byte;
|
|
who_knows2: Byte;
|
|
end;
|
|
|
|
const
|
|
DefaultHeader: TgaHeader = (
|
|
who_knows: (0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
Width: 320;
|
|
Height: 200;
|
|
BitsPerPixel: 24;
|
|
who_knows2: 32
|
|
);
|
|
|
|
var
|
|
tf: File of Byte;
|
|
tff: File absolute tf;
|
|
|
|
procedure StartTga(s: String);
|
|
begin
|
|
Assign(tf,s);
|
|
Rewrite(tf);
|
|
BlockWrite(tff,DefaultHeader,18);
|
|
end;
|
|
|
|
procedure EndTga;
|
|
begin
|
|
Close(tf);
|
|
end;
|
|
|
|
procedure TgaDot(r,g,b: Integer);
|
|
begin
|
|
if r > 255 then r := 255;
|
|
if g > 255 then g := 255;
|
|
if b > 255 then b := 255;
|
|
if r < 0 then r := 0;
|
|
if g < 0 then g := 0;
|
|
if b < 0 then b := 0;
|
|
Write(tf,Byte(b),Byte(g),Byte(r));
|
|
end;
|
|
|
|
{ r,g,b:0-255 }
|
|
function Rgb(r,g,b: Integer): Integer;
|
|
begin
|
|
if r > 255 then r := 255;
|
|
if g > 255 then g := 255;
|
|
if b > 255 then b := 255;
|
|
Rgb := (b shr 6) or ((g shr 3) and $1c) or (r and $e0);
|
|
end;
|
|
|
|
procedure RgbDot(x,y,r,g,b: Integer);
|
|
var
|
|
r1,g1,b1,r2,g2,b2,c1,c2: Integer;
|
|
begin
|
|
if r > 255 then r := 255;
|
|
if g > 255 then g := 255;
|
|
if b > 255 then b := 255;
|
|
if r < 0 then r := 0;
|
|
if g < 0 then g := 0;
|
|
if b < 0 then b := 0;
|
|
r1 := r and $e0; g1 := g and $e0; b1 := b and $c0;
|
|
r2 := r1 + (r mod 32)+16;
|
|
g2 := g1 + (g mod 32)+16;
|
|
b2 := b1 + (b mod 64)+32;
|
|
c1 := Rgb(r1,g1,b1); c2 := Rgb(r2,g2,b2);
|
|
if (x mod 2) = (y mod 2) then PutPixel(x,y,c1) else PutPixel(x,y,c2);
|
|
end;
|
|
|
|
procedure SetUpRgb;
|
|
var
|
|
Clrs: array[0..255,0..2] of Byte;
|
|
i: Integer;
|
|
begin
|
|
for i := 0 to 255 do begin
|
|
Clrs[i,0] := (i and $e0) shr 2;
|
|
Clrs[i,1] := (i and $1c) shl 1;
|
|
Clrs[i,2] := (i and 3) shl 4;
|
|
case Clrs[i,2] of
|
|
15..31: Inc(Clrs[i,2],4);
|
|
32..63: Inc(Clrs[i,2],8);
|
|
end;
|
|
end;
|
|
SetColorBlock(0,256,Clrs);
|
|
end;
|
|
|
|
procedure Save(var u: Universe; st: String);
|
|
var
|
|
x,y: Integer;
|
|
c: LongInt;
|
|
r,g,b: Integer;
|
|
begin
|
|
StartTga(st);
|
|
x := 0;
|
|
for y := 0 to u.Height-1 do
|
|
for x := 0 to u.Width-1 do begin
|
|
c := u.TracePoint(x,y);
|
|
r := (c and $ff0000) shr 16;
|
|
g := (c and $ff00) shr 8;
|
|
b := c and $ff;
|
|
RgbDot(x,u.Height-1-y,r,g,b);
|
|
TgaDot(r,g,b);
|
|
end;
|
|
EndTga;
|
|
end;
|
|
|
|
procedure Draw(var u: Universe);
|
|
var
|
|
x,y: Integer;
|
|
c: LongInt;
|
|
begin
|
|
x := 0;
|
|
while (x < u.Width) and (not KeyPressed) do begin
|
|
for y := 0 to u.Height-1 do begin
|
|
c := u.TracePoint(x,u.Height-1-y);
|
|
if c <> 0 then
|
|
RgbDot(x,y,(c and $ff0000) shr 16,(c and $ff00) shr 8,c and $ff);
|
|
end;
|
|
Inc(x);
|
|
end;
|
|
end;
|
|
|
|
procedure Qwik(var u: Universe);
|
|
var
|
|
x,y: Integer;
|
|
c: LongInt;
|
|
r,g,b: Byte;
|
|
begin
|
|
x := 0;
|
|
while (x < (u.Width div 2)) and (not KeyPressed) do begin
|
|
for y := 0 to (u.Height div 2)-1 do begin
|
|
c := u.TracePoint(x*2,u.Height-1-(y*2));
|
|
if c <> 0 then begin
|
|
r := (c and $ff0000) shr 16;
|
|
g := (c and $ff00) shr 8;
|
|
b := c and $ff;
|
|
RgbDot(x*2,y*2,r,g,b); RgbDot(x*2+1,y*2,r,g,b);
|
|
RgbDot(x*2+1,y*2+1,r,g,b); RgbDot(x*2,y*2+1,r,g,b);
|
|
end;
|
|
end;
|
|
Inc(x);
|
|
end;
|
|
end;
|
|
|
|
procedure Zoom(var u: Universe);
|
|
var
|
|
x,y,i,j: Integer;
|
|
c: LongInt;
|
|
r,g,b: Byte;
|
|
begin
|
|
x := 0;
|
|
while (x < (u.Width div 4)) and (not KeyPressed) do begin
|
|
for y := 0 to (u.Height div 4)-1 do begin
|
|
c := u.TracePoint(x*4,u.Height-1-(y*4));
|
|
if c <> 0 then begin
|
|
r := (c and $ff0000) shr 16;
|
|
g := (c and $ff00) shr 8;
|
|
b := c and $ff;
|
|
for i := 0 to 3 do
|
|
for j := 0 to 3 do
|
|
RgbDot(x*4+i,y*4+j,r,g,b);
|
|
end;
|
|
end;
|
|
Inc(x);
|
|
end;
|
|
end;
|
|
|
|
procedure Beep;
|
|
begin
|
|
Sound(220); { Beep }
|
|
Delay(200); { For 200 ms }
|
|
NoSound; { Relief! }
|
|
end;
|
|
|
|
type
|
|
Plane1 = object(Plane)
|
|
cr,cg,cb: Integer;
|
|
constructor Init(x, y, z, vx, vy, vz: real; r,g,b: Integer);
|
|
function GetColor(aray: Ray; time: Real): LongInt; virtual;
|
|
end;
|
|
Sphere1 = object(Sphere)
|
|
cr,cg,cb: Integer;
|
|
constructor Init(x, y, z, r: real; rr,g,b: Integer);
|
|
function GetColor(aray: Ray; time: Real): LongInt; virtual;
|
|
end;
|
|
Sphere2 = object(Sphere)
|
|
function GetColor(aray: Ray; time: Real): LongInt; virtual;
|
|
end;
|
|
|
|
|
|
function Sphere2.GetColor(aray: Ray; time: Real): LongInt;
|
|
var
|
|
r: Ray;
|
|
c,c2: LongInt;
|
|
cc: record b,g,r: Byte end absolute c;
|
|
cc2: record b,g,r: Byte end absolute c2;
|
|
begin
|
|
ReflectRay(aray,time,r);
|
|
c := Owner^.RayColor(r);
|
|
c2 := Shade(aray,time,GetRgb(64,64,64));
|
|
GetColor := GetRgb(cc.r-64+cc2.r,cc.g-64+cc2.g,cc.b-64+cc2.b);
|
|
end;
|
|
|
|
constructor Sphere1.Init(x, y, z, r: real; rr,g,b: Integer);
|
|
begin
|
|
Sphere.Init(x,y,z,r);
|
|
cr := rr; cg := g; cb := b;
|
|
end;
|
|
|
|
function Sphere1.GetColor(aray: Ray; time: Real): LongInt;
|
|
begin
|
|
GetColor := Shade(aray,time,GetRgb(cr,cg,cb));
|
|
end;
|
|
|
|
constructor Plane1.Init(x, y, z, vx, vy, vz: real; r,g,b: Integer);
|
|
begin
|
|
Plane.Init(x,y,z,vx,vy,vz);
|
|
cr := r; cg := g; cb := b;
|
|
end;
|
|
|
|
function Plane1.GetColor(aray: Ray; time: Real): LongInt;
|
|
begin
|
|
GetColor := Shade(aray,time,GetRgb(cr,cg,cb));
|
|
end;
|
|
|
|
procedure TraceIt;
|
|
var
|
|
u: Universe;
|
|
l1,l2,l3,l4,l5,l6: LightSource;
|
|
p1,p2,p3,p4,p5,p6: Plane1;
|
|
s1,s2,s3,s4,s5,s6: Sphere1;
|
|
ss1,ss2: Sphere2;
|
|
begin
|
|
u.Init(320,200, 32,32,32);
|
|
l1.Init(14.9,7.9,49.9, 1024,1024,1024);
|
|
l2.Init(-14.9,7.9,49.9, 1024,1024,1024);
|
|
l3.Init(0,7.9,49.9, 1024,1024,1024);
|
|
l4.Init(-14.9,7.9,35, 1024,1024,1024);
|
|
l5.Init(14.9,7.9,35, 1024,1024,1024);
|
|
l6.Init(0,7.9,35, 1024,1024,1024);
|
|
p1.Init(0,-8,0, 0,1,0, 192,192,192);
|
|
p2.Init(0,8,0, 0,-1,0, 192,192,192);
|
|
p3.Init(0,0,50, 0,0,-1, 192,0,0);
|
|
p4.Init(0,0,-10, 0,0,1, 192,0,0);
|
|
p5.Init(-15,0,0, 1,0,0, 0,192,0);
|
|
p6.Init(15,0,0, -1,0,0, 0,192,0);
|
|
s1.Init(-8,-6,40,2, 192,0,0);
|
|
s2.Init(-4,-6,40,2, 0,192,0);
|
|
s3.Init(-6,-6,36.4,2, 0,0,192);
|
|
s4.Init(-6,-2.8,38.8,2, 192,192,192);
|
|
ss1.Init(-15,-8,50,5);
|
|
ss2.Init(15,-8,50,5);
|
|
u.Insert(@ss1);
|
|
u.Insert(@ss2);
|
|
u.Insert(@s1);
|
|
u.Insert(@s2);
|
|
u.Insert(@s3);
|
|
u.Insert(@s4);
|
|
u.Insert(@p1);
|
|
u.Insert(@p2);
|
|
u.Insert(@p3);
|
|
u.Insert(@p4);
|
|
u.Insert(@p5);
|
|
u.Insert(@p6);
|
|
u.InsertLight(@l1);
|
|
u.InsertLight(@l2);
|
|
u.InsertLight(@l3);
|
|
u.InsertLight(@l4);
|
|
u.InsertLight(@l5);
|
|
u.InsertLight(@l6);
|
|
{Zoom(u);}
|
|
Save(u,'brooke6.tga');
|
|
Beep;
|
|
u.DeleteAll;
|
|
u.Done;
|
|
end;
|
|
|
|
begin
|
|
Set13h;
|
|
SetUpRgb;
|
|
TraceIt;
|
|
ReadKey;
|
|
BiosMode(3);
|
|
end. |