Page 1 of 1
rotating one cube with madpascal.
Posted: Tue Apr 09, 2024 7:54 am
by funkheld
Here is a demo with a rotating cube using MadPascal. X16 with "-mhz 24" from MADRAFi.
X16 release 47
cube1.prg
load "cube1.prg",8
greeting
Re: rotating one cube with madpascal.
Posted: Mon Apr 15, 2024 5:26 pm
by MADRAFi
Thanks for checking this one. I think if you wish to make it prettier you would need to use frame buffer to hide flickering.
a8 examples have implementations using such buffering.
Re: rotating one cube with madpascal.
Posted: Mon Apr 15, 2024 8:07 pm
by funkheld
Thanks for the info.
I did it without a buffer.
I just did a quick clss in asm.
I'm not familiar with the buffers yet.
greeting
Code: Select all
program cube;
uses x16_vera, x16, crt,graph;
const Linien =12;
Ecken =8;
distanz =2000.0;
sinphi =0.195090322016;
cosphi =0.980785280411;
var start,
Ende : array [0..Linien] of smallint;
x, y, z : array [0..Ecken] of real;
x2d, y2d : array [0..Ecken] of smallint;
Alt : array [0..Linien*4] of smallint;
Laenge : real;
Add_X , Add_Y : word ;
d: cardinal;
f:byte;
tempX, tempY, tempZ: real;
procedure clss;
begin
asm
lda #0
sta $9f20
lda #0
sta $9f21
lda #$10
sta $9f22
lda #1
ldx #0
loop1:
ldy #150
loop:
sta $9f23
sta $9f23
dey
bne loop
dex
bne loop1
end;
end;
procedure XRotation;
var i: byte;
begin
for i := 0 to Ecken-1 do
begin
tempY:=y[i];
tempZ:=z[i];
y[i] :=tempY*cosphi - tempZ*sinphi;
z[i] :=tempZ*cosphi + tempY*sinphi;
end;
pause(1);
end;
procedure YRotation;
var i: byte;
begin
for i := 0 to Ecken-1 do
begin
tempX:=x[i];
tempZ:=z[i];
x[i] :=tempX*cosphi - tempZ*sinphi;
z[i] :=tempZ*cosphi + tempX*sinphi;
end;
end;
procedure ZRotation;
var i: byte;
begin
for i := 0 to Ecken-1 do
begin
tempX:=x[i];
tempY:=y[i];
x[i] :=tempX*cosphi - tempY*sinphi;
y[i] :=tempY*cosphi + tempX*sinphi;
end;
clss;
end;
procedure Zeichne_Wuerfel;
var i,x : byte;
begin
for i := 0 to Linien-1 do
begin
x:=i shl 2;
Alt[x]:=x2d[start[i]];
Alt[x+1]:=y2d[start[i]];
Alt[x+2]:=x2d[Ende[i]];
Alt[x+3]:=y2d[Ende[i]];
MoveTo (Alt[x],Alt[x+1]);
LineTo (Alt[x+2],Alt[x+3]);
end;
end;
procedure Wandle_3D_2D;
var i:byte;
f:real;
begin
for i := 0 to Ecken-1 do
begin
f := 1000.0 / (distanz-z[i]);
x2d[i]:=TRUNC(x[i]*f) + Add_X;
y2d[i]:=TRUNC(y[i]*f) + Add_Y;
end;
end;
procedure SetzePunkte;
begin
x[0]:=-Laenge;
y[0]:= Laenge;
z[0]:= Laenge;
x[1]:= Laenge;
y[1]:= Laenge;
z[1]:= Laenge;
x[2]:= Laenge;
y[2]:=-Laenge;
z[2]:= Laenge;
x[3]:=-Laenge;
y[3]:=-Laenge;
z[3]:= Laenge;
x[4]:=-Laenge;
y[4]:= Laenge;
z[4]:=-Laenge;
x[5]:= Laenge;
y[5]:= Laenge;
z[5]:=-Laenge;
x[6]:= Laenge;
y[6]:=-Laenge;
z[6]:=-Laenge;
x[7]:=-Laenge;
y[7]:=-Laenge;
z[7]:=-Laenge;
end;
procedure SetzeLinien;
begin
start[ 0]:=0; Ende[ 0]:=1;
start[ 1]:=1; Ende[ 1]:=2;
start[ 2]:=2; Ende[ 2]:=3;
start[ 3]:=3; Ende[ 3]:=0;
start[ 4]:=0; Ende[ 4]:=4;
start[ 5]:=1; Ende[ 5]:=5;
start[ 6]:=2; Ende[ 6]:=6;
start[ 7]:=3; Ende[ 7]:=7;
start[ 8]:=4; Ende[ 8]:=5;
start[ 9]:=5; Ende[ 9]:=6;
start[10]:=6; Ende[10]:=7;
start[11]:=7; Ende[11]:=4;
end;
begin
InitGraph(X16_MODE_320x240);
Poke($9f25,0);
Laenge:=ScreenHeight shr 1 - 10;
Add_X :=ScreenWidth shr 1;
Add_Y :=ScreenHeight shr 1;
fillchar(Alt, sizeof(Alt), 0);
SetzePunkte;
SetzeLinien;
YRotation;
ZRotation;
repeat
XRotation;
//YRotation;
//ZRotation;
Wandle_3D_2D;
clss;
Zeichne_Wuerfel;
until keypressed;
end.