Started Graf3DPrimitives

This commit is contained in:
neauoire 2020-05-10 13:39:20 +09:00
parent 072482a750
commit 50554147a2
2 changed files with 174 additions and 0 deletions

120
examples/3d.scene.pas Normal file
View File

@ -0,0 +1,120 @@
program ExampleScene;
uses
FixMath, Graf3D, Graf3DPrimitives;
var
w: WindowPtr; {A window to draw in}
r: Rect; {A window Size}
myPort: GrafPort;
myPort3D: Port3D;
pa, pb: Point3D;
hangle, vangle: Longint;
{cursor}
cursor, prev: Point;
isDown: Boolean;
{scene}
box1: Box3D;
{>>}
procedure PaintAxis (size: Integer);
begin
PenPat(black);
MoveTo3D(0, 0, 0);
LineTo3D(Long2Fix(size), 0, 0);
WriteDraw('x');
MoveTo3D(0, 0, 0);
LineTo3D(0, Long2Fix(size), 0);
WriteDraw('y');
MoveTo3D(0, 0, 0);
LineTo3D(0, 0, Long2Fix(size));
WriteDraw('z');
end;
{>>}
procedure WindowInit;
begin
SetRect(r, 100, 50, 300, 250);
w := NewWindow(nil, r, 'Study', true, zoomDocProc, WindowPtr(-1), false, 0);
SetPort(w);
end;
{>>}
procedure ClearScreen;
var
size: Rect;
begin
SetRect(size, 0, 0, 200, 200);
FillRect(size, white);
end;
{>>}
procedure Redraw;
var
i: Integer;
begin
ClearScreen;
LookAt(Long2Fix(-200), Long2Fix(200), Long2Fix(200), Long2Fix(-200));
ViewAngle(Long2Fix(50));
Identity;
Roll(Long2Fix(hangle));
Pitch(Long2Fix(vangle)); { roll and pitch the plane }
for i := 1 to 12 do
begin
MoveTo3D(box1.edges[i].a.x, box1.edges[i].a.y, box1.edges[i].a.z);
LineTo3D(box1.edges[i].b.x, box1.edges[i].b.y, box1.edges[i].b.z);
end;
end;
{>>}
procedure WhenDownChanged;
var
hoff, voff: Integer;
begin
hoff := prev.h - cursor.h;
hangle := hangle + hoff;
voff := prev.v - cursor.v;
vangle := vangle + voff;
Redraw;
GetMouse(prev);
end;
{>>}
procedure WhenDown;
begin
GetMouse(cursor);
if cursor.h <> prev.h then
if cursor.v <> prev.v then
WhenDownChanged;
end;
{>>}
procedure MainLoop;
begin
repeat {Until we click outside screen}
while button do
begin
GetMouse(cursor);
GetMouse(prev);
repeat {Tight loop until button up}
WhenDown;
until not Button;
end;
until cursor.h < 0;
end;
begin
WindowInit;
InitGrf3D(nil);
Open3DPort(@myPort3D);
ViewPort(thePort^.portRect);
{scene}
SetBox3D(box1, 0, 0, 0, 100, 100, 100);
Redraw;
MainLoop;
end.

View File

@ -0,0 +1,54 @@
unit Graf3DPrimitives;
interface
uses
FixMath, Graf3D;
type
Link3D = record
a: Point3D;
b: Point3D;
end;
type
Box3D = record
vertices: array[1..9] of Point3D;
edges: array[1..13] of Link3D;
end;
procedure SetLk3D (var lk3D: Link3D; a, b: Point3D);
procedure SetBox3D (var shape: Box3D; x, y, z, w, h, d: Fixed);
implementation
procedure SetLk3D (var lk3D: Link3D; a, b: Point3D);
begin
lk3D.a := a;
lk3D.b := b;
end;
procedure SetBox3D (var shape: Box3D; x, y, z, w, h, d: Fixed);
begin
SetPt3D(shape.vertices[1], Long2Fix(x + w div 2), Long2Fix(y + h div 2), Long2Fix(z + d div 2));
SetPt3D(shape.vertices[2], Long2Fix(x + w div 2), Long2Fix(y + h div 2), Long2Fix(z - d div 2));
SetPt3D(shape.vertices[3], Long2Fix(x - w div 2), Long2Fix(y + h div 2), Long2Fix(z - d div 2));
SetPt3D(shape.vertices[4], Long2Fix(x - w div 2), Long2Fix(y + h div 2), Long2Fix(z + d div 2));
SetPt3D(shape.vertices[5], Long2Fix(x + w div 2), Long2Fix(y - h div 2), Long2Fix(z + d div 2));
SetPt3D(shape.vertices[6], Long2Fix(x + w div 2), Long2Fix(y - h div 2), Long2Fix(z - d div 2));
SetPt3D(shape.vertices[7], Long2Fix(x - w div 2), Long2Fix(y - h div 2), Long2Fix(z - d div 2));
SetPt3D(shape.vertices[8], Long2Fix(x - w div 2), Long2Fix(y - h div 2), Long2Fix(z + d div 2));
SetLk3D(shape.edges[1], shape.vertices[1], shape.vertices[2]);
SetLk3D(shape.edges[2], shape.vertices[2], shape.vertices[3]);
SetLk3D(shape.edges[3], shape.vertices[3], shape.vertices[4]);
SetLk3D(shape.edges[4], shape.vertices[4], shape.vertices[1]);
SetLk3D(shape.edges[5], shape.vertices[5], shape.vertices[6]);
SetLk3D(shape.edges[6], shape.vertices[6], shape.vertices[7]);
SetLk3D(shape.edges[7], shape.vertices[7], shape.vertices[8]);
SetLk3D(shape.edges[8], shape.vertices[8], shape.vertices[5]);
SetLk3D(shape.edges[9], shape.vertices[1], shape.vertices[5]);
SetLk3D(shape.edges[10], shape.vertices[2], shape.vertices[6]);
SetLk3D(shape.edges[11], shape.vertices[3], shape.vertices[7]);
SetLk3D(shape.edges[12], shape.vertices[4], shape.vertices[8]);
end;
end.