MODULE Simple3DDemo; FROM SYSTEM IMPORT ADR,FFP; FROM IntuitionD IMPORT NewScreen,ScreenPtr,NewWindow,WindowPtr,WindowFlags, WindowFlagSet,IDCMPFlagSet,customScreen; FROM IntuitionL IMPORT OpenScreen,OpenWindow,CloseScreen,CloseWindow, ScreenToFront; FROM GraphicsD IMPORT RastPortPtr,ViewModes,ViewModeSet; FROM GraphicsL IMPORT SetRast,SetAPen,Move,Text; FROM DosL IMPORT Delay; FROM Simple3D IMPORT GetCube,SetCamera,SimpleRender,RenderFlags,RenderFlagSet, MoveObjectDirect,RotateObject,AddObject,InitDisplay, ObjectHandlePtr,DisplayPtr,AreaPtr,FreeDisplay, InitObject,GetCircle,GetRotationObject,FreeObject, CopyObject,MoveObject,RotationFlagSet,RotationFlags, AddPoint,AddArea; FROM MathTrans IMPORT Cos,Sin,Exp; (* Ähnliche Prozeduren wie 'CreateScreen' und 'CreateWindow' befinden *) (* sich auch in dem Modul IntuitionSupport, das aus Portabilitäts- *) (* gründen nicht benutzt wird. *) PROCEDURE CreateScreen(w,h,d : INTEGER; vm : ViewModeSet) : ScreenPtr; VAR ns : NewScreen; BEGIN WITH ns DO leftEdge:=0; topEdge:=0; width:=w; height:=h; depth:=d; detailPen:=0; blockPen:=1; viewModes:=vm; type:=customScreen; font:=NIL; defaultTitle:=ADR("3D-Demo"); gadgets:=NIL; customBitMap:=NIL; END; RETURN OpenScreen(ns); END CreateScreen; PROCEDURE CreateWindow(x,y,w,h : INTEGER; scr : ScreenPtr) : WindowPtr; VAR nw : NewWindow; BEGIN WITH nw DO leftEdge:=x; topEdge:=y; width:=w; height:=h; detailPen:=0; blockPen:=1; idcmpFlags:=IDCMPFlagSet{}; flags:=WindowFlagSet{gimmeZeroZero,backDrop,noCareRefresh,borderless}; firstGadget:=NIL; checkMark:=NIL; title:=ADR("3D-Demo"); screen:=scr; type:=customScreen; bitMap:=NIL; END; RETURN OpenWindow(nw); END CreateWindow; PROCEDURE f(x,y : FFP) : FFP; BEGIN RETURN Cos(x*x*x+y*y)-Sin(y);; END f; VAR scr : ARRAY[0..1] OF ScreenPtr; win : ARRAY[0..1] OF WindowPtr; rp : ARRAY[0..1] OF RastPortPtr; ob1,ob2 : ObjectHandlePtr; d : DisplayPtr; t,pic : INTEGER; x,y : INTEGER; xh,yh : FFP; xe,ye : FFP; a : AreaPtr; rs : RenderFlagSet; graph : ARRAY[-20..20] OF ARRAY[-20..20] OF FFP; BEGIN FOR t:=0 TO 1 DO scr[t]:=CreateScreen(160,128,2,ViewModeSet{}); IF scr[t]#NIL THEN win[t]:=CreateWindow(0,0,160,128,scr[t]); END; END; IF (win[0]#NIL) AND (win[1]#NIL) THEN rp[0]:=win[0]^.rPort; rp[1]:=win[1]^.rPort; d:=InitDisplay(); ob1:=GetCube(-50.0,-50.0,50.0,50.0,100.0,1,0); MoveObjectDirect(ob1,0.0,0.0,-50.0); AddObject(d,ob1); pic:=0; rs:=RenderFlagSet{}; FOR t:=-100 TO 100 DO SimpleRender(d,rp[pic],rs); ScreenToFront(scr[pic]); (* Double-Buffering mit Screens *) pic:=1-pic; RotateObject(ob1,10,8,6); SetRast(rp[pic],0); IF t=0 THEN INCL(rs,hiddenLine); END; END; FreeDisplay(d); END; ob2:=InitObject(); a:=GetCircle(ob2,150.0,0.0,50.0,16,360); ob1:=GetRotationObject(a,64,RotationFlagSet{},2,1); FreeObject(NIL,ob2); (* Wird nicht mehr benötigt *) IF win[0]#NIL THEN CloseWindow(win[0]); win[0]:=NIL; END; IF scr[0]#NIL THEN CloseScreen(scr[0]); scr[0]:=NIL; END; IF win[1]#NIL THEN CloseWindow(win[1]); win[1]:=NIL; END; IF scr[1]#NIL THEN CloseScreen(scr[1]); scr[1]:=NIL; END; scr[0]:=CreateScreen(640,512,2,ViewModeSet{hires,lace}); IF scr[0]#NIL THEN win[0]:=CreateWindow(0,0,640,512,scr[0]); IF win[0]#NIL THEN rp[0]:=win[0]^.rPort; SetAPen(rp[0],1); Move(rp[0],20,20); Text(rp[0], ADR("Das folgende Bild besteht aus 2048 Flächen und 8192 Punkten!"), 60); ob2:=CopyObject(ob1); RotateObject(ob2,100,0,0); MoveObject(ob2,150.0,0.0,40.0); d:=InitDisplay(); AddObject(d,ob1); AddObject(d,ob2); SetCamera(d,200.0,700.0,500.0, 75.0,0.0,0.0, 400.0); SimpleRender(d,rp[0],RenderFlagSet{hiresMode,laceMode}); SetAPen(rp[0],1); Move(rp[0],20,28); Text(rp[0],ADR("Nun in HiddenLine-Darstellung!"),30); SimpleRender(d,rp[0],RenderFlagSet{hiresMode,laceMode,hiddenLine}); FreeDisplay(d); FOR x:=-20 TO 20 DO FOR y:=-20 TO 20 DO graph[x,y]:=f(FFP(x)/6.0,FFP(y)/6.0)*50.0; END; END; ob1:=InitObject(); FOR x:=-20 TO 19 DO FOR y:=-20 TO 19 DO a:=NIL; xh:=FFP(x*50); xe:=FFP(x*50+50); yh:=FFP(y*50); ye:=FFP(y*50+50); AddPoint(ob1,a,xh,yh,graph[x,y]); AddPoint(ob1,a,xe,yh,graph[x+1,y]); AddPoint(ob1,a,xe,ye,graph[x+1,y+1]); AddPoint(ob1,a,xh,ye,graph[x,y+1]); AddArea(ob1,a,1,2); END; END; SetRast(rp[0],0); SetAPen(rp[0],1); Move(rp[0],20,20); Text(rp[0], ADR("f(x,y)=Cos(x^3+y^2)-Sin(y) (1600 Flächen und 6400 Punkte!)"),58); d:=InitDisplay(); AddObject(d,ob1); SetCamera(d,400.0,-3000.0,1200.0, 0.0,0.0,0.0, 300.0); SimpleRender(d,rp[0],RenderFlagSet{hiresMode,laceMode,hiddenLine}); Delay(800); ELSE CloseScreen(scr[0]); scr[0]:=NIL; END; END; CLOSE FreeDisplay(d); IF win[0]#NIL THEN CloseWindow(win[0]); END; IF scr[0]#NIL THEN CloseScreen(scr[0]); END; IF win[1]#NIL THEN CloseWindow(win[1]); END; IF scr[1]#NIL THEN CloseScreen(scr[1]); END; END Simple3DDemo.