Home » Archimedes archive » Acorn User » AU 1993-10.adf » !3DGraphic_3DGraphic » 3Ded
3Ded
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Acorn User » AU 1993-10.adf » !3DGraphic_3DGraphic |
Filename: | 3Ded |
Read OK: | ✔ |
File size: | 8F9E bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM >3Ded 20REM A simple 3D editor 30REM By DCA 40REM For 32-bit machines 50REM (c) BAU October 1993 60: 70MODE 15 80OFF 90*FX 229,1 100*POINTER 1 110MOUSE ON 120PROCinit_modules 130PROCinit 140PROCscreen 150MOUSE was_mx%,was_my%,was_mb% 160click_time%=TIME 170PROCensure_there_is_a_world 180quit%=FALSE 190REPEAT 200 MOUSE mx%,my%,mb% 210 repeating%=FALSE 220 IF mb%<>was_mb% THEN 230 was_mb%=mb% 240 click_time%=TIME 250 IF mb%<>0 THEN 260 PROCclick(mx%,my%,mb%) 270 ENDIF 280 ELSE 290 IF TIME-click_time%>repeat% AND mb%<>0 THEN 300 IF mx%=was_mx% AND my%=was_my% AND my%>40 AND mx%<66*16 THEN 310 PROCidle(mx%,my%,mb%) 320 ELSE 330 WAIT 340 repeating%=TRUE 350 PROCclick(mx%,my%,mb%) 360 ENDIF 370 ELSE 380 k%=INKEY(0) 390 IF k%=27 AND (INKEY-1 OR INKEY-2) quit%=TRUE 400 IF k%<>-1 THEN 410 PROCkey(k%) 420 ELSE 430 PROCidle(mx%,my%,mb%) 440 ENDIF 450 ENDIF 460 ENDIF 470 was_mx%=mx% 480 was_my%=my% 490UNTIL quit% 500MODE 12 510*FX 229,0 520END 530: 540DEF PROCinit 550 560max_vert=256 570verts=0 580DIM v(max_vert,2) 590 600DIM col_spr% 20*1024 610!col_spr%=20*1024 620col_spr%!4=0 630col_spr%!8=16 640col_spr%!12=16 650SYS "OS_SpriteOp",15+256,col_spr%,"cols",,16*8,16*8,15 660SYS "OS_SpriteOp",60+256,col_spr%,"cols" 670FOR col%=0 TO 255 680 GCOL col% AND 63 TINT col% AND 192 690 RECTANGLE FILL 16*(col% MOD 16),32*(col% DIV 16),16,32 700NEXT 710SYS "OS_SpriteOp",60+256,col_spr%,0 720 730max=400 740DIM obj 4*max,saved(max) 750 760heap_size=(HIMEM-END-32*1024) AND (NOT 4095) 770DIM heap heap_size 780SYS "BAU3D_HeapInit",heap,heap_size 790 800dist=800:zplus=10000 810ang_scale=&10000/360 820 830DIM com$(10),file$(256),rgb%(2) 840com$()="*","LOAD","SAVE","EDIT","POLY","ZOOM","CREATE","DELETE","MERGE","CLOSE" 850white%=&FFFFFF00 860black%=&00000000 870dark_red%=&00006000 880yellow%=&00F0F000 890blue%=&F0000000 900panel_width%=512-16 910panel_height%=(1024-180) DIV 2 920cur_mode%=-1 930DIM view_xyz 12,view_ang 12 940DIM oxyz%(3,2),oang%(3,2) 950PROCinit_orig 960oang%(2,0)=90 970oang%(3,1)=-90 980ang_scale=&10000/360 990scale=10000 1000cur_obj%=-1 1010selected%=-1 1020vertex%=-1 1030info_mode%=-1 1040objects=0 1050obj_first=0 1060scale2d=5000 1070cur_view%=-1 1080 1090DIM panel_x0%(3),panel_y0%(3),panel_x1%(3),panel_y1%(3) 1100panel_x0%()=0,16+panel_width%,0,16+panel_width% 1110panel_x1%()=panel_x0%()+panel_width% 1120panel_y0%()=40,40,40+16+panel_height%,40+16+panel_height% 1130panel_y1%()=panel_y0%()+panel_height% 1140 1150repeat%=30 1160view_needs_update%=FALSE 1170cur_view_needs_update%=FALSE 1180zoom%=10 1190 1200bit_merge=64 1210bit_surf=128 1220bit_disp=256 1230bit_dispall=512 1240bit_closed=1024 1250 1260obj_list=0 1270obj_name=4 1280obj_req=8 1290 1300surf_type=0 1310surf_colour=4 1320surf_n=8 1330surf_coords=12 1340surf_req=12 1350 1360subobj_next=0 1370subobj_type=4 1380subobj_flags=8 1390subobj_offset=12 1400subobj_angle=24 1410subobj_surfreq=36 1420subobj_bounds=36 1430subobj_req=132 1440 1450ENDPROC 1460: 1470DEF PROCinit_modules 1480*RMEnsure BAU3D 0.40 RMLoad BAU3D 1490*RMEnsure ColourTrans 1.00 Error 0 3Ded requires ColourTrans module 1500ENDPROC 1510: 1520DEF PROCinit_orig 1530oxyz%()=0 1540oxyz%(0,2)=2000000 1550ENDPROC 1560: 1570DEF PROCshow_commands 1580LOCAL i% 1590FOR i%=0 TO 9 1600 PROCshow_command(i%) 1610NEXT 1620ENDPROC 1630: 1640DEF PROCshow_command(i%) 1650LOCAL x% 1660VDU 5 1670x%=128*i% 1680IF i%=cur_mode% PROCgcol(blue%) ELSE PROCgcol(dark_red%) 1690RECTANGLE FILL x%,1024-44,124,40 1700IF i%=cur_mode% PROCgcol(yellow%) ELSE PROCgcol(white%) 1710RECTANGLE x%,1024-44,124,40 1720MOVE x%+64-8*LEN(com$(i%)),1024-12 1730PRINT;com$(i%); 1740VDU 4 1750OFF 1760ENDPROC 1770: 1780DEF PROCgcol(rgb%) 1790SYS "ColourTrans_SetGCOL",rgb%,,,&100 1800ENDPROC 1810: 1820DEF PROCcolour(rgb%) 1830LOCAL col% 1840SYS "ColourTrans_ReturnGCOL",rgb% TO col% 1850COLOUR (col%>>2) TINT (col% AND 3)<<6 1860ENDPROC 1870: 1880DEF PROCcolourb(rgb%) 1890LOCAL col% 1900SYS "ColourTrans_ReturnGCOL",rgb% TO col% 1910COLOUR 128+(col%>>2) TINT (col% AND 3)<<6 1920ENDPROC 1930: 1940DEF PROCscreen 1950LOCAL i% 1960VDU 26,20 1970CLS 1980OFF 1990PROCshow_commands 2000PROCshow_panels 2010PROCinfo_bar 2020ENDPROC 2030: 2040DEF PROCshow_panels 2050LOCAL i% 2060FOR i%=0 TO 3 2070 PROCshow_panel(i%) 2080NEXT 2090ENDPROC 2100: 2110DEF PROCshow_panel(panel%) 2120LOCAL x%,y%,i% 2130x%=(panel% MOD 2)*(panel_width%+16) 2140y%=(panel% DIV 2)*(panel_height%+16)+40 2150PROCgcol(black%) 2160RECTANGLE FILL x%,y%,panel_width%,panel_height% 2170IF panel%=cur_view% PROCgcol(yellow%) ELSE PROCgcol(white%) 2180RECTANGLE x%,y%,panel_width%,panel_height% 2190ORIGIN 0,0 2200VDU 24,x%+2;y%+4;x%+panel_width%-2;y%+panel_height%-4; 2210ORIGIN x%+panel_width% DIV 2,y%+panel_height% DIV 2 2220IF cur_obj%<>-1 THEN 2230 CASE panel% OF 2240 WHEN 0: 2250 FOR i%=0 TO 2 2260 view_xyz!(4*i%)=oxyz%(0,i%) 2270 view_ang!(4*i%)=oang%(0,i%) 2280 NEXT 2290 SYS "BAU3D_WriteConfig",%110,dist,zplus,-zplus*0.8,10000000 2300 SYS "BAU3D_Render",obj!(4*cur_obj%),view_xyz,view_ang 2310 WHEN 1,2,3:PROCview_2d(panel%) 2320 ENDCASE 2330ENDIF 2340VDU 26 2350OFF 2360ENDPROC 2370: 2380DEF PROCview_2d(p%) 2390LOCAL i%,x0,x1,y0,y1,xmin,ymin,zmin,xmax,ymax,zmax,ox,oy,oz,aa,ao,x,y 2400LOCAL surf% 2410FOR i%=0 TO 2 2420 view_xyz!(4*i%)=oxyz%(p%,i%) 2430 view_ang!(4*i%)=ang_scale*oang%(p%,i%) 2440NEXT 2450SYS "BAU3D_WriteConfig",%110,dist,zplus,-10000000,100000000 2460SYS "BAU3D_Render2D",obj!(4*cur_obj%),view_xyz,view_ang,scale2d*(10/zoom%) 2470IF selected%<>-1 THEN 2480 PROCgcol(white%) 2490 IF (selected%!subobj_flags AND bit_surf)>0 THEN 2500 surf%=selected%!subobj_type 2510 coords%=surf%+surf_coords 2520 PROCgcol(white%) 2530 MOVE FNx(p%,0),FNy(p%,0) 2540 FOR i%=surf%!surf_n-1 TO 0 STEP -1 2550 DRAW FNx(p%,i%),FNy(p%,i%) 2560 NEXT 2570 FOR i%=0 TO surf%!surf_n-1 2580 IF i%=vertex% PROCgcol(yellow%) ELSE PROCgcol(white%) 2590 RECTANGLE FNx(p%,i%)-8,FNy(p%,i%)-8,16,16 2600 NEXT 2610 ELSE 2620 PROCfind_bounding_cube(selected%,xmin,ymin,zmin,xmax,ymax,zmax) 2630 ao=selected%+subobj_offset 2640 aa=selected%+subobj_angle 2650 ox=!ao 2660 oy=ao!4 2670 oz=ao!8 2680 CASE p% OF 2690 WHEN 1: 2700 x0=xmin+ox 2710 y0=ymin+oy 2720 x1=xmax+ox 2730 y1=ymax+oy 2740 WHEN 2: 2750 x0=xmin+ox 2760 y0=zmin+oz 2770 x1=xmax+ox 2780 y1=zmax+oz 2790 WHEN 3: 2800 x0=zmin+oz 2810 y0=ymin+oy 2820 x1=zmax+oz 2830 y1=ymax+oy 2840 ENDCASE 2850 x0=(oxyz%(p%,0)+x0)/(scale2d/(zoom%/10)) 2860 x1=(oxyz%(p%,0)+x1)/(scale2d/(zoom%/10)) 2870 y0=(oxyz%(p%,1)+y0)/(scale2d/(zoom%/10)) 2880 y1=(oxyz%(p%,1)+y1)/(scale2d/(zoom%/10)) 2890 RECTANGLE x0,y0,x1-x0,y1-y0 2900 ENDIF 2910ENDIF 2920IF cur_mode%=4 THEN 2930 IF verts>0 THEN 2940 PROCgcol(white%) 2950 FOR i%=0 TO verts-1 2960 CASE p% OF 2970 WHEN 1: 2980 x=(oxyz%(p%,0)+v(i%,0))/(scale2d/(zoom%/10)) 2990 y=(oxyz%(p%,1)+v(i%,1))/(scale2d/(zoom%/10)) 3000 WHEN 2: 3010 x=(oxyz%(p%,0)+v(i%,0))/(scale2d/(zoom%/10)) 3020 y=(oxyz%(p%,1)+v(i%,2))/(scale2d/(zoom%/10)) 3030 WHEN 3: 3040 x=(oxyz%(p%,0)+v(i%,2))/(scale2d/(zoom%/10)) 3050 y=(oxyz%(p%,1)+v(i%,1))/(scale2d/(zoom%/10)) 3060 ENDCASE 3070 CIRCLE FILL x,y,4 3080 NEXT 3090 ENDIF 3100ENDIF 3110ENDPROC 3120: 3130DEF PROCclick(mx%,my%,mb%) 3140LOCAL file% 3150IF my%>=1024-44 THEN 3160 PROCmode_select(mx% DIV 128) 3170ELSE 3180 CASE cur_mode% OF 3190 WHEN 1: 3200 file%=FNwhich_file(mx%,my%) 3210 IF file%<>-1 THEN 3220 PROCclear 3230 PROCload("objects."+file$(file%)) 3240 PROCselect_obj(FNidentify_keyword("world")) 3250 PROCmode_select(3) 3260 ENDIF 3270 WHEN 3: 3280 PROCdraw_click(mx%,my%,mb%) 3290 WHEN 4: 3300 PROCpoly_click(mx%,my%,mb%) 3310 WHEN 5: 3320 PROCzoom_click(mx%,my%) 3330 ENDCASE 3340ENDIF 3350ENDPROC 3360: 3370DEF PROCselect_obj(new%) 3380IF new%>objects-1 new%=objects-1 ELSE IF new%<0 new%=-1 3390cur_obj%=new% 3400selected%=-1 3410PROCinit_orig 3420IF cur_obj%<>-1 PROCensure_visible(cur_obj%) 3430PROCinfo_bar 3440ENDPROC 3450: 3460DEF PROCzoom_click(mx%,my%) 3470LOCAL pos% 3480IF my%<40 THEN 3490 pos%=mx% DIV 16 3500 IF pos%=0 AND zoom%>10 zoom%-=1:PROCinfo_bar:view_needs_update%=TRUE 3510 IF pos%=8 AND zoom%<100 zoom%+=1:PROCinfo_bar:view_needs_update%=TRUE 3520ELSE 3530 PROCmode_select(3) 3540ENDIF 3550ENDPROC 3560: 3570DEF PROCpoly_click(mx%,my%,mb%) 3580IF FNpan(mx%,my%,mb%) ENDPROC 3590IF FNcheck_for_colour(mx%,my%,mb%) ENDPROC 3600IF FNcheck_for_add_vertex(mx%,my%,mb%) ENDPROC 3610ENDPROC 3620: 3630DEF FNcheck_for_add_vertex(mx%,my%,mb%) 3640LOCAL ok%,i%,x,y,z 3650IF mx%>66*16 THEN =FALSE 3660IF my%<40 THEN =FALSE 3670ok%=FALSE 3680i%=1 3690WHILE i%<4 AND NOT ok% 3700 IF mx%>=panel_x0%(i%) AND mx%<panel_x1%(i%) THEN 3710 IF my%>=panel_y0%(i%) AND my%<panel_y1%(i%) THEN 3720 IF i%<>cur_view% THEN 3730 cur_view%=i% 3740 view_needs_update%=TRUE 3750 ENDIF 3760 mx%-=(panel_x0%(i%)+panel_width%/2) 3770 my%-=(panel_y0%(i%)+panel_height%/2) 3780 CASE mb% OF 3790 WHEN 1: 3800 PROCdone_polygon 3810 WHEN 4: 3820 CASE cur_view% OF 3830 WHEN 1: 3840 x=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) 3850 y=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) 3860 z=0 3870 WHEN 2: 3880 x=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) 3890 y=0 3900 z=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) 3910 WHEN 3: 3920 x=0 3930 y=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) 3940 z=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) 3950 ENDCASE 3960 v(verts,0)=x 3970 v(verts,1)=y 3980 v(verts,2)=z 3990 verts+=1 4000 IF verts=max_vert PROCdone_polygon 4010 view_needs_update%=TRUE 4020 ENDCASE 4030 ok%=TRUE 4040 ENDIF 4050 ENDIF 4060 i%+=1 4070ENDWHILE 4080=ok% 4090: 4100DEF PROCdone_polygon 4110LOCAL new_surf%,new_sub%,i%,a 4120IF verts>=3 THEN 4130 SYS "BAU3D_Malloc",surf_req+12*verts TO new_surf% 4140 new_surf%!surf_type=0 4150 new_surf%!surf_colour=(rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24) 4160 new_surf%!surf_n=verts 4170 FOR i%=0 TO verts-1 4180 a=new_surf%+surf_coords+12*i% 4190 !a=v(i%,0) 4200 a!4=v(i%,1) 4210 a!8=v(i%,2) 4220 NEXT 4230 SYS "BAU3D_Malloc",subobj_req TO new_sub% 4240 new_sub%!subobj_flags=bit_surf 4250 new_sub%!subobj_type=new_surf% 4260 FOR i%=0 TO 2 4270 new_sub%!(subobj_offset+4*i%)=0 4280 new_sub%!(subobj_angle+4*i%)=0 4290 NEXT 4300 IF !(FNo+obj_list)=0 THEN 4310 new_sub%!subobj_next=0 4320 !(FNo+obj_list)=new_sub% 4330 ELSE 4340 a=!(FNo+obj_list) 4350 WHILE a!subobj_next<>0 4360 a=a!subobj_next 4370 ENDWHILE 4380 new_sub%!subobj_next=0 4390 a!subobj_next=new_sub% 4400 ENDIF 4410ENDIF 4420view_needs_update%=TRUE 4430verts=0 4440ENDPROC 4450: 4460DEF PROCdraw_click(mx%,my%,mb%) 4470IF FNcheck_for_click_on_vertex(mx%,my%,mb%) ENDPROC 4480IF FNcheck_for_name_edit(mx%,my%,mb%) ENDPROC 4490IF FNcheck_for_colour(mx%,my%,mb%) ENDPROC 4500IF FNdrag_obj(mx%,my%,mb%) ENDPROC 4510IF FNdrag_v(mx%,my%,mb%) ENDPROC 4520IF FNpan(mx%,my%,mb%) ENDPROC 4530IF FNcheck_for_insert_obj(mx%,my%,mb%) ENDPROC 4540IF my%<40 PROCoffset_click(mx%,my%):ENDPROC 4550IF mx%>66*16 PROCobjlist_click(mx%,my%,mb%):ENDPROC 4560IF repeating% ENDPROC 4570IF cur_view%=-1 THEN 4580 PROCtry_new_panel(mx%,my%) 4590ELSE 4600 IF mx%<panel_x0%(cur_view%) OR mx%>panel_x1%(cur_view%) OR my%<panel_y0%(cur_view%) OR my%>panel_y1%(cur_view%) THEN 4610 PROCtry_new_panel(mx%,my%) 4620 ELSE 4630 IF mb%<>2 PROCselect_object(mx%,my%,mb%) 4640 ENDIF 4650ENDIF 4660ENDPROC 4670: 4680DEF FNcheck_for_click_on_vertex(mx%,my%,mb%) 4690LOCAL i%,ok%,surf%,j%,x%,y% 4700REM IF INKEY-1 THEN =FALSE 4710IF my%<40 OR mx%>66*16 THEN =FALSE 4720IF NOT FNediting_surf THEN =FALSE 4730IF repeating% THEN =FALSE 4740IF cur_obj%=-1 OR selected%=-1 THEN =FALSE 4750IF (selected%!subobj_flags AND bit_surf)=0 THEN =FALSE 4760surf%=selected%!subobj_type 4770ok%=FALSE 4780i%=1 4790WHILE i%<4 AND NOT ok% 4800 IF mx%>=panel_x0%(i%) AND mx%<panel_x1%(i%) THEN 4810 IF my%>=panel_y0%(i%) AND my%<panel_y1%(i%) THEN 4820 x%=mx%-(panel_x0%(i%)+panel_width%/2) 4830 y%=my%-(panel_y0%(i%)+panel_height%/2) 4840 FOR j%=0 TO surf%!surf_n-1 4850 IF ABS(x%-FNx(i%,j%))<32 THEN 4860 IF ABS(y%-FNy(i%,j%))<32 THEN 4870 ok%=TRUE 4880 vertex%=j% 4890 view_needs_update%=TRUE 4900 ENDIF 4910 ENDIF 4920 NEXT 4930 ENDIF 4940 ENDIF 4950 i%+=1 4960ENDWHILE 4970IF NOT ok% AND vertex%<>1 THEN 4980 vertex%=-1 4990 ok%=TRUE 5000 view_needs_update%=TRUE 5010 PROCtry_new_panel(mx%,my%) 5020ENDIF 5030PROCinfo_bar 5040=ok% 5050: 5060DEF FNcheck_for_insert_obj(mx%,my%,mb%) 5070LOCAL x%,y%,b%,obj_to_drag%,x2%,y2%,drag$,ok%,i% 5080LOCAL ERROR 5090ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:=FALSE 5100IF FNediting_surf THEN RESTORE ERROR:=FALSE 5110IF NOT ((mb%=4 OR mb%=1) AND repeating%) THEN RESTORE ERROR:=FALSE 5120IF mx%<66*16 THEN RESTORE ERROR:=FALSE 5130y%=31-(my% DIV 32) 5140IF y%<4 OR y%>28 THEN RESTORE ERROR:=FALSE 5150obj_to_drag%=obj_first+y%-4 5160IF obj_to_drag%<0 OR obj_to_drag%>=objects THEN RESTORE ERROR:=FALSE 5170drag$=FNget_string(!(obj!(4*obj_to_drag%)+obj_name)) 5180MOUSE x%,y%,b% 5190VDU 5 5200GCOL 4,63 TINT 192 5210PROCshow_drag 5220REPEAT 5230 MOUSE x2%,y2%,b% 5240 IF x2%<>x% OR y2%<>y% THEN 5250 PROCshow_drag 5260 x%=x2% 5270 y%=y2% 5280 PROCshow_drag 5290 ENDIF 5300UNTIL b%=0 5310PROCshow_drag 5320VDU 4 5330OFF 5340IF FNcheck_for_self_ref(obj!(4*obj_to_drag%),obj!(4*cur_obj%)) THEN ERROR 9999,"Illegal self-reference" 5350ok%=FALSE 5360FOR i%=1 TO 3 5370 IF x%>=panel_x0%(i%) AND x%<panel_x1%(i%) AND y%>=panel_y0%(i%) AND y%<panel_y1%(i%) THEN 5380 ok%=TRUE 5390 PROCinsert_an_obj(obj_to_drag%,i%,x%,y%) 5400 i%=3 5410 ENDIF 5420NEXT 5430RESTORE ERROR 5440=ok% 5450: 5460DEF PROCinsert_an_obj(o,p%,mx%,my%) 5470LOCAL new,a 5480IF cur_obj%=-1 THEN ENDPROC 5490SYS "BAU3D_Malloc",subobj_req TO new 5500a=obj!(4*cur_obj%) 5510new!subobj_next=a!obj_list 5520a!obj_list=new 5530new!(subobj_angle+0)=0 5540new!(subobj_angle+4)=0 5550new!(subobj_angle+8)=0 5560mx%-=(panel_x0%(p%)+panel_width%/2) 5570my%-=(panel_y0%(p%)+panel_height%/2) 5580CASE p% OF 5590 WHEN 1: 5600 new!(subobj_offset+0)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) 5610 new!(subobj_offset+4)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) 5620 new!(subobj_offset+8)=0 5630 WHEN 2: 5640 new!(subobj_offset+0)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) 5650 new!(subobj_offset+4)=0 5660 new!(subobj_offset+8)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) 5670 WHEN 3: 5680 new!(subobj_offset+0)=0 5690 new!(subobj_offset+4)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) 5700 new!(subobj_offset+8)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) 5710OTHERWISE 5720 new!(subobj_offset+0)=0 5730 new!(subobj_offset+4)=0 5740 new!(subobj_offset+8)=0 5750ENDCASE 5760new!subobj_type=obj!(4*o) 5770new!subobj_flags=0 5780SYS "BAU3D_CalcBounds",obj!(4*cur_obj%) 5790view_needs_update%=TRUE 5800ENDPROC 5810: 5820DEF PROCshow_drag 5830WAIT 5840MOVE x%-8*LEN(drag$),y%+8 5850PRINT;drag$; 5860ENDPROC 5870: 5880DEF FNcheck_for_name_edit(mx%,my%,mb%) 5890LOCAL was$,o,name 5900LOCAL ERROR 5910ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:OFF:=TRUE 5920IF cur_mode%<>3 THEN RESTORE ERROR:=FALSE 5930IF cur_obj%=-1 THEN RESTORE ERROR:=FALSE 5940o=obj!(4*cur_obj%) 5950IF my%<1024-3*32 OR my%>1024-2*32 THEN RESTORE ERROR:=FALSE 5960IF mx%>60*16 THEN RESTORE ERROR:=FALSE 5970IF o!obj_name>0 was$=FNget_string(o!obj_name) ELSE was$="" 5980ON 5990PRINTTAB(0,2)SPC60; 6000PRINTTAB(0,2)"New name: "; 6010*FX 15 6020PROCins(was$) 6030INPUT""new$ 6040new$=FNlc_and_us(FNstrip(new$)) 6050IF new$<>"" THEN 6060 SYS "BAU3D_Malloc",LEN(new$)+2 TO name 6070 $name=new$+CHR$0 6080 SYS "BAU3D_Free",o!obj_name 6090 o!obj_name=name 6100 PROCinfo_bar 6110 PROClist_objects 6120ENDIF 6130OFF 6140RESTORE ERROR 6150=TRUE 6160: 6170DEF FNcheck_for_colour(mx%,my%,mb%) 6180LOCAL i%,ok%,col%,tint% 6190IF NOT (FNediting_surf OR cur_mode%=4) THEN =FALSE 6200IF mx%<64*16 THEN =FALSE 6210ok%=FALSE 6220IF mx%>=64*16 AND mx%<64*16+16*16 AND my%>=2*32 AND my%<2*32+16*32 THEN 6230 ok%=TRUE 6240 col%=POINT(mx%,my%) 6250 tint%=TINT(mx%,my%) 6260 FOR i%=0 TO 2 6270 rgb%(i%)=(((col%>>(i%*2)) AND 3)<<6) OR (tint%>>2) 6280 NEXT 6290 PROCshow_colour_bar 6300ELSE 6310 IF my%>=20*32-16 AND my%<20*32+256+16 THEN 6320 FOR i%=0 TO 2 6330 IF mx%>=72*16+32*i% AND mx%<=72*16+32*i%+16 THEN 6340 rgb%(i%)=my%-20*32 6350 IF rgb%(i%)<0 rgb%(i%)=0 ELSE IF rgb%(i%)>255 rgb%(i%)=255 6360 ok%=TRUE 6370 PROCshow_colour_bar 6380 ENDIF 6390 NEXT 6400 ENDIF 6410ENDIF 6420IF ok% THEN 6430 IF FNediting_surf THEN 6440 IF (selected%!subobj_flags AND bit_surf)>0 THEN 6450 !(selected%!subobj_type+surf_colour)=(rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24) 6460 view_needs_update%=TRUE 6470 ENDIF 6480 ENDIF 6490ENDIF 6500=ok% 6510: 6520DEF PROCerr_bar(can_esc%) 6530LOCAL wait 6540IF can_esc% AND ERR=17 ENDPROC 6550COLOUR %11 6560PRINTTAB(0,31)SPC79; 6570PRINTTAB(0,31);REPORT$; 6580IF ERR<>9999 PRINT"' at line ";ERL; 6590PRINT" - press a key"; 6600VDU 20 6610*FX 15 6620wait=GET 6630ENDPROC 6640: 6650DEF PROCins(i$) 6660LOCAL i% 6670IF i$="" ENDPROC 6680FOR i%=1 TO LEN(i$) 6690 SYS "OS_Byte",138,0,ASCMID$(i$,i%) 6700NEXT 6710ENDPROC 6720: 6730DEF FNstrip(a$) 6740WHILE ASC(a$)=32 6750 a$=MID$(a$,2) 6760ENDWHILE 6770WHILE RIGHT$(a$)=" " 6780 a$=LEFT$(a$) 6790ENDWHILE 6800=a$ 6810: 6820DEF FNlc(a$) 6830LOCAL b$,i%,c% 6840b$="" 6850IF a$<>"" THEN 6860 FOR i%=1 TO LEN(a$) 6870 c%=ASCMID$(a$,i%) 6880 IF c%>=ASC"A" AND c%<=ASC"Z" THEN c%+=32 6890 b$+=CHR$c% 6900 NEXT 6910ENDIF 6920=b$ 6930: 6940DEF FNlc_and_us(a$) 6950LOCAL b$,i%,c% 6960b$="" 6970IF a$<>"" THEN 6980 FOR i%=1 TO LEN(a$) 6990 c%=ASCMID$(a$,i%) 7000 IF c%>=ASC"A" AND c%<=ASC"Z" THEN c%+=32 7010 IF c%=32 c%=ASC"_" 7020 b$+=CHR$c% 7030 NEXT 7040ENDIF 7050=b$ 7060: 7070DEF PROCselect_object(mx%,my%,mb%) 7080LOCAL p%,loop%,ok% 7090IF cur_obj%=-1 ENDPROC 7100IF cur_view%<=0 ENDPROC 7110IF selected%<>-1 AND mb%=1 THEN ENDPROC 7120IF selected%=-1 THEN 7130 loop%=!(FNo+obj_list) 7140ELSE 7150 loop%=selected% 7160ENDIF 7170p%=loop%!subobj_next 7180IF p%=0 THEN p%=!(FNo+obj_list) 7190ok%=FALSE 7200WHILE p%<>loop% AND NOT ok% 7210 IF p%<>0 THEN 7220 ok%=TRUE:REM should compare co-ordinates here ideally 7230 ELSE 7240 p%=p%!subobj_next 7250 IF p%=0 THEN p%=!(FNo+obj_list) 7260 ENDIF 7270ENDWHILE 7280IF NOT ok% THEN 7290 IF !(FNo+obj_list)=0 THEN 7300 PROCselect_object_raw(-1) 7310 ELSE 7320 PROCselect_object_raw(!(FNo+obj_list)) 7330 ENDIF 7340ELSE 7350 PROCselect_object_raw(p%) 7360ENDIF 7370ENDPROC 7380: 7390DEF PROCselect_object_raw(addr%) 7400LOCAL i% 7410IF addr%<>selected% THEN 7420 selected%=addr% 7430 vertex%=0 7440 view_needs_update%=TRUE 7450 PROCset_info_mode(5) 7460ENDIF 7470IF selected%<>-1 THEN 7480 IF (selected%!subobj_flags AND bit_surf)>0 THEN 7490 FOR i%=0 TO 2 7500 rgb%(i%)=?(selected%!subobj_type+surf_colour+1+i%) 7510 NEXT 7520 PROCcls_right 7530 PROCshow_colour_bar 7540 ELSE 7550 PROCcls_right 7560 PROClist_objects 7570 ENDIF 7580ENDIF 7590ENDPROC 7600: 7610DEF FNpan(mx%,my%,mb%) 7620LOCAL dx%,dy% 7630IF NOT (mb%=2 AND repeating%) THEN =FALSE 7640dx%=(mx%-was_mx%)*scale2d*(10/zoom%) 7650dy%=(my%-was_my%)*scale2d*(10/zoom%) 7660CASE cur_view% OF 7670 WHEN 0,1,2,3: 7680 oxyz%(cur_view%,0)+=dx% 7690 oxyz%(cur_view%,1)+=dy% 7700 cur_view_needs_update%=TRUE 7710 PROCinfo_bar 7720ENDCASE 7730=TRUE 7740: 7750DEF FNdrag_obj(mx%,my%,mb%) 7760LOCAL dx%,dy%,o 7770IF NOT ((mb%=4 OR mb%=1) AND repeating% AND cur_obj%<>-1 AND selected%<>-1AND NOT INKEY-1) THEN =FALSE 7780IF my%<40 THEN =FALSE 7790IF mx%>66*16 THEN =FALSE 7800IF (selected%!subobj_flags AND bit_surf)>0 THEN =FALSE 7810dx%=(mx%-was_mx%)*scale2d*(10/zoom%) 7820dy%=(my%-was_my%)*scale2d*(10/zoom%) 7830o=selected%+subobj_offset 7840CASE cur_view% OF 7850 WHEN 1: 7860 o!0+=dx% 7870 o!4+=dy% 7880 WHEN 2: 7890 o!0+=dx% 7900 o!8+=dy% 7910 WHEN 3: 7920 o!8+=dx% 7930 o!4+=dy% 7940ENDCASE 7950PROCinfo_bar 7960view_needs_update%=TRUE 7970=TRUE 7980: 7990DEF FNdrag_v(mx%,my%,mb%) 8000LOCAL dx%,dy%,o 8010IF NOT ((mb%=1 OR mb%=4) AND repeating% AND cur_obj%<>-1 AND selected%<>-1) THEN =FALSE 8020IF my%<40 THEN =FALSE 8030IF mx%>66*16 THEN =FALSE 8040IF (selected%!subobj_flags AND bit_surf)=0 THEN =FALSE 8050dx%=(mx%-was_mx%)*scale2d*(10/zoom%) 8060dy%=(my%-was_my%)*scale2d*(10/zoom%) 8070o=selected%!subobj_type+surf_coords+12*vertex% 8080CASE cur_view% OF 8090 WHEN 1: 8100 o!0+=dx% 8110 o!4+=dy% 8120 WHEN 2: 8130 o!0+=dx% 8140 o!8+=dy% 8150 WHEN 3: 8160 o!8+=dx% 8170 o!4+=dy% 8180ENDCASE 8190PROCinfo_bar 8200view_needs_update%=TRUE 8210=TRUE 8220: 8230DEF PROCoffset_click(mx%,my%) 8240LOCAL pos%,shift%,a%,ang_shift% 8250shift%=100 8260ang_shift%=ang_scale 8270IF INKEY-1 shift%=1000:ang_shift%=5*ang_scale 8280IF INKEY-2 shift%=10000:ang_shift%=10*ang_scale 8290CASE TRUE OF 8300 WHEN cur_mode%=3 AND selected%=-1: 8310 IF cur_view%<>-1 THEN 8320 pos%=mx% DIV 16 8330 CASE pos% OF 8340 WHEN 0,10,20: 8350 oxyz%(cur_view%,pos% DIV 10)-=shift% 8360 cur_view_needs_update%=TRUE 8370 PROCinfo_bar 8380 WHEN 8,18,28: 8390 oxyz%(cur_view%,(pos%-8) DIV 10)+=shift% 8400 cur_view_needs_update%=TRUE 8410 PROCinfo_bar 8420 WHEN 35,45,55: 8430 oang%(cur_view%,(pos%-35) DIV 10)=(oang%(cur_view%,(pos%-35) DIV 10)-ang_shift%) AND &FFFF 8440 cur_view_needs_update%=TRUE 8450 PROCinfo_bar 8460 WHEN 43,53,63: 8470 oang%(cur_view%,(pos%-35) DIV 10)=(oang%(cur_view%,(pos%-35) DIV 10)+ang_shift%) AND &FFFF 8480 cur_view_needs_update%=TRUE 8490 PROCinfo_bar 8500 OTHERWISE 8510 IF (pos%>=2 AND pos%<=6) OR (pos%>=12 AND pos%<=16) OR (pos%>=22 AND pos%<=26) THEN 8520 IF cur_view%>0 THEN 8530 PROCinput_view_offs 8540 ELSE 8550 PROCinput_view_offs_3D 8560 ENDIF 8570 ELSE 8580 IF (pos%>=37 AND pos%<=41) OR (pos%>=47 AND pos%<=51) OR (pos%>=57 AND pos%<=61) THEN 8590 IF cur_view%=0 THEN 8600 PROCinput_view_angs_3D 8610 ENDIF 8620 ENDIF 8630 ENDIF 8640 ENDCASE 8650 ENDIF 8660 WHEN cur_mode%=3 AND selected%<>-1 AND NOT FNediting_surf: 8670 pos%=mx% DIV 16: 8680 CASE pos% OF 8690 WHEN 0,10,20: 8700 selected%!(subobj_offset+4*(pos% DIV 10))-=shift% 8710 view_needs_update%=TRUE 8720 PROCinfo_bar 8730 WHEN 8,18,28: 8740 selected%!(subobj_offset+4*(pos% DIV 10))+=shift% 8750 view_needs_update%=TRUE 8760 PROCinfo_bar 8770 PROCupdate_bounds 8780 WHEN 35,45,55: 8790 a%=selected%+subobj_angle+4*((pos%-35) DIV 10) 8800 !a%=(!a%-ang_shift%) AND &FFFF 8810 view_needs_update%=TRUE 8820 PROCinfo_bar 8830 PROCupdate_bounds 8840 WHEN 43,53,63: 8850 a%=selected%+subobj_angle+4*((pos%-43) DIV 10) 8860 !a%=(!a%+ang_shift%) AND &FFFF 8870 view_needs_update%=TRUE 8880 PROCinfo_bar 8890 PROCupdate_bounds 8900 OTHERWISE 8910 IF (pos%>=2 AND pos%<=6) OR (pos%>=12 AND pos%<=16) OR (pos%>=22 AND pos%<=26) THEN 8920 PROCinput_obj_offs 8930 ELSE 8940 IF (pos%>=37 AND pos%<=41) OR (pos%>=47 AND pos%<=51) OR (pos%>=57 AND pos%<=61) THEN 8950 PROCinput_obj_angs 8960 ENDIF 8970 ENDIF 8980 ENDCASE 8990 WHEN FNediting_surf: 9000 IF vertex%=-1 THEN 9010 ELSE 9020 pos%=mx% DIV 16 9030 CASE pos% OF 9040 WHEN 0,10,20: 9050 !(selected%!subobj_type+surf_coords+12*vertex%+4*(pos% DIV 10))-=shift% 9060 view_needs_update%=TRUE 9070 PROCinfo_bar 9080 WHEN 8,18,28: 9090 !(selected%!subobj_type+surf_coords+12*vertex%+4*(pos% DIV 10))+=shift% 9100 view_needs_update%=TRUE 9110 PROCinfo_bar 9120 PROCupdate_bounds 9130 OTHERWISE 9140 IF (pos%>=2 AND pos%<=6) OR (pos%>=12 AND pos%<=16) OR (pos%>=22 AND pos%<=26) THEN 9150 PROCinput_vertex 9160 ENDIF 9170 ENDCASE 9180 ENDIF 9190ENDCASE 9200ENDPROC 9210: 9220DEF PROCinput_view_offs 9230LOCAL ERROR 9240ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9250PROCinput("X screen offset",oxyz%(cur_view%,0),100) 9260PROCinfo_bar 9270PROCinput("Y screen offset",oxyz%(cur_view%,1),100) 9280PROCinfo_bar 9290cur_view_needs_update%=TRUE 9300RESTORE ERROR 9310ENDPROC 9320: 9330DEF PROCinput_view_offs_3D 9340LOCAL ERROR 9350ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9360PROCinput("X offset",oxyz%(cur_view%,0),100) 9370PROCinfo_bar 9380PROCinput("Y offset",oxyz%(cur_view%,1),100) 9390PROCinfo_bar 9400PROCinput("Z offset",oxyz%(cur_view%,2),100) 9410PROCinfo_bar 9420cur_view_needs_update%=TRUE 9430RESTORE ERROR 9440ENDPROC 9450: 9460DEF PROCinput_view_angs_3D 9470LOCAL ERROR 9480ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9490PROCinput("angle about X axis",oang%(cur_view%,0),ang_scale) 9500PROCinfo_bar 9510PROCinput("angle about Y axis",oang%(cur_view%,1),ang_scale) 9520PROCinfo_bar 9530PROCinput("angle about Z axis",oang%(cur_view%,2),ang_scale) 9540PROCinfo_bar 9550cur_view_needs_update%=TRUE 9560RESTORE ERROR 9570ENDPROC 9580: 9590DEF PROCinput_obj_offs 9600LOCAL ERROR 9610ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9620PROCinput("X offset",selected%!(subobj_offset+0),100) 9630PROCinfo_bar 9640PROCinput("Y offset",selected%!(subobj_offset+4),100) 9650PROCinfo_bar 9660PROCinput("Z offset",selected%!(subobj_offset+8),100) 9670PROCinfo_bar 9680view_needs_update%=TRUE 9690RESTORE ERROR 9700ENDPROC 9710: 9720DEF PROCinput_obj_angs 9730LOCAL ERROR 9740ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9750PROCinput("angle about X axis",selected%!(subobj_angle+0),ang_scale) 9760PROCinfo_bar 9770PROCinput("angle about Y axis",selected%!(subobj_angle+4),ang_scale) 9780PROCinfo_bar 9790PROCinput("angle about Z axis",selected%!(subobj_angle+8),ang_scale) 9800PROCinfo_bar 9810view_needs_update%=TRUE 9820RESTORE ERROR 9830ENDPROC 9840: 9850DEF PROCinput_vertex 9860LOCAL ERROR 9870ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 9880PROCinput("vertex X",!(selected%!subobj_type+surf_coords+12*vertex%+0),100) 9890PROCinfo_bar 9900PROCinput("vertex Y",!(selected%!subobj_type+surf_coords+12*vertex%+4),100) 9910PROCinfo_bar 9920PROCinput("vertex Z",!(selected%!subobj_type+surf_coords+12*vertex%+8),100) 9930PROCinfo_bar 9940view_needs_update%=TRUE 9950RESTORE ERROR 9960ENDPROC 9970: 9980DEF PROCinput(inp$,RETURN v%,scale) 9990LOCAL ERROR 10000ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):OFF:ENDPROC 10010ON 10020PRINTTAB(0,2)SPC60TAB(0,2)"Enter "inp$;": "; 10030*FX 15 10040PROCins(FNfloat(v%/scale)) 10050INPUT""v 10060v%=v*scale 10070OFF 10080RESTORE ERROR 10090ENDPROC 10100: 10110DEF FNediting_surf 10120IF selected%=-1 THEN =FALSE 10130=(selected%!subobj_flags AND bit_surf)>0 10140: 10150DEF PROCupdate_bounds 10160IF cur_obj%<>0 SYS "BAU3D_CalcBounds",obj!(4*cur_obj%) 10170ENDPROC 10180: 10190DEF PROCobjlist_click(mx%,my%,mb%) 10200LOCAL x%,y% 10210y%=31-(my% DIV 32) 10220x%=mx% DIV 16 10230IF y%=2 THEN 10240 IF x%>=69 AND x%<77 AND obj_first>0 THEN 10250 obj_first-=1 10260 RECTANGLE 66*16,4*32,14*16,24*32-4 TO 66*16,3*32 10270 PROClistobj(obj_first,obj_first) 10280 ENDIF 10290ELSE 10300 IF y%=30 THEN 10310 IF x%>=69 AND x%<77 AND obj_first+25<objects THEN 10320 obj_first+=1 10330 RECTANGLE 66*16,3*32,14*16,24*32-4 TO 66*16,4*32 10340 PROClistobj(obj_first+24,obj_first+24) 10350 ENDIF 10360 ELSE 10370 IF mb%=2 THEN 10380 IF y%>=4 AND y%<=28 THEN 10390 PROCselect_obj(obj_first+y%-4) 10400 PROClist_objects 10410 view_needs_update%=TRUE 10420 ENDIF 10430 ENDIF 10440 ENDIF 10450ENDIF 10460ENDPROC 10470: 10480DEF PROCtry_new_panel(mx%,my%) 10490LOCAL i% 10500FOR i%=0 TO 3 10510 IF mx%>=panel_x0%(i%) AND mx%<panel_x1%(i%) AND my%>=panel_y0%(i%) AND my%<panel_y1%(i%) PROCselect_view(i%) 10520NEXT 10530ENDPROC 10540: 10550DEF PROCselect_view(v%) 10560cur_view%=v% 10570selected%=-1 10580PROCshow_panels 10590PROCset_info_mode(cur_view%) 10600ENDPROC 10610: 10620DEF FNfind_elem(a$(),b$) 10630LOCAL i% 10640i%=0 10650WHILE b$<>a$(i%) 10660 i%+=1 10670ENDWHILE 10680=i% 10690: 10700DEF PROCidle(mx%,my%,mb%) 10710LOCAL i% 10720CASE cur_mode% OF 10730 WHEN 3,4,5: 10740 IF cur_view_needs_update% THEN 10750 PROCshow_panel(cur_view%) 10760 cur_view_needs_update%=FALSE 10770 ENDIF 10780 IF view_needs_update% THEN 10790 FOR i%=0 TO 3 10800 PROCshow_panel(i%) 10810 NEXT 10820 view_needs_update%=FALSE 10830 ENDIF 10840ENDCASE 10850ENDPROC 10860: 10870DEF PROCtoggle(bit) 10880IF selected%<>-1 THEN 10890 selected%!subobj_flags=selected%!subobj_flags EOR bit 10900 PROCinfo_bar 10910 view_needs_update%=TRUE 10920ENDIF 10930ENDPROC 10940: 10950DEF PROCmode_select(mode%) 10960IF mode%=7 THEN PROCdelete:ENDPROC 10970IF mode%=8 THEN PROCtoggle(bit_merge):ENDPROC 10980IF mode%=9 THEN PROCtoggle(bit_closed):ENDPROC 10990PROCmode_deselect(cur_mode%) 11000cur_mode%=mode% 11010PROCshow_command(cur_mode%) 11020selected%=-1 11030CASE cur_mode% OF 11040 WHEN 0: 11050 PROCcls 11060 PROCcatalogue 11070 WHEN 1: 11080 PROCcls 11090 PROCcatalogue 11100 WHEN 2: 11110 PROCcls 11120 PROCcatalogue 11130 PROCsave 11140 WHEN 3: 11150 PROCcls 11160 PROCset_info_mode(cur_view%) 11170 PROCshow_panels 11180 PROClist_objects 11190 PROCinfo_bar 11200 WHEN 4: 11210 IF cur_obj%=-1 THEN 11220 PROCmode_select(3) 11230 ELSE 11240 PROCcls 11250 PROCset_info_mode(cur_view%) 11260 PROCshow_panels 11270 rgb%()=&FF,&FF,&FF 11280 PROCshow_colour_bar 11290 PROCinfo_bar 11300 verts=0 11310 ENDIF 11320 WHEN 5: 11330 PROCset_info_mode(4) 11340 PROCinfo_bar 11350 WHEN 6: 11360 PROCcreate 11370 PROCinfo_bar 11380ENDCASE 11390ENDPROC 11400: 11410DEF PROCmode_deselect(mode%) 11420LOCAL i% 11430IF cur_mode%=-1 ENDPROC 11440i%=cur_mode% 11450cur_mode%=-1 11460PROCshow_command(i%) 11470ENDPROC 11480: 11490DEF PROCcatalogue 11500LOCAL dir$,cat% 11510dir$="Objects" 11520SYS "BAU3D_Malloc",256 TO cat% 11530p%=0 11540files%=0 11550done%=FALSE 11560WHILE NOT done% 11570 SYS "OS_GBPB",9,dir$,cat%,1,p%,256,"*" TO ,,,read%,p% 11580 done%=read%=0 OR p%=-1 11590 IF NOT done% THEN 11600 i%=0 11610 WHILE cat%?i%>32 11620 i%+=1 11630 ENDWHILE 11640 cat%?i%=13 11650 file$(files%)=$cat% 11660 files%+=1 11670 ENDIF 11680ENDWHILE 11690IF files%=0 THEN 11700 PROCwarn("No files to load") 11710 PROCmode_select(3) 11720ELSE 11730 FOR i%=0 TO files%-1 11740 PRINT TAB(12*(i% MOD 6),3+2*(i% DIV 6));file$(i%); 11750 NEXT 11760ENDIF 11770SYS "BAU3D_Free",cat% 11780ENDPROC 11790: 11800DEF FNwhich_file(mx%,my%) 11810LOCAL select%,i%,x0%,x1%,y0%,y1% 11820select%=-1 11830FOR i%=0 TO files%-1 11840 x0%=12*16*(i% MOD 6) 11850 y0%=1024-4*32-64*(i% DIV 6) 11860 x1%=x0%+16*LEN(file$(i%)) 11870 y1%=y0%+32 11880 IF mx%>=x0% AND mx%<=x1% AND my%>=y0% AND my%<=y1% select%=i%:i%=files% 11890NEXT 11900=select% 11910: 11920DEF PROCwarn(warn$) 11930ENDPROC 11940: 11950DEF PROCcls 11960PROCgcol(black%) 11970RECTANGLE FILL 0,0,1279,1024-48 11980ENDPROC 11990: 12000DEF PROCcls_right 12010PROCgcol(black%) 12020RECTANGLE FILL 64*16,0,16*16,1024-48 12030ENDPROC 12040: 12050DEF PROCset_info_mode(new%) 12060IF new%<>info_mode% THEN 12070 info_mode%=new% 12080 PRINTTAB(0,31)SPC79; 12090 PROCinfo_bar 12100ENDIF 12110ENDPROC 12120: 12130DEF PROCinfo_bar 12140PRINTTAB(0,31)SPC79;TAB(0,2);SPC60; 12150PROCshow_name 12160PROCshow_flags 12170CASE info_mode% OF 12180 WHEN 0,1,2,3: 12190 PROCshow_orig_and_angs(info_mode%) 12200 WHEN 4: 12210 PROCshow_zoom 12220 WHEN 5: 12230 PROCshow_obj_pos 12240ENDCASE 12250ENDPROC 12260: 12270DEF PROCshow_orig_and_angs(p%) 12280LOCAL i%,x%,v%,v$,n% 12290IF p%=0 n%=5 ELSE n%=1 12300FOR i%=0 TO n% 12310 IF i%<3 v%=oxyz%(p%,i%) DIV 100 ELSE v%=oang%(p%,i%-3)/ang_scale 12320 x%=10*i% 12330 IF i%>2 x%+=5 12340 PROCleft_arrow(x%,31) 12350 PROCright_arrow(x%+8,31) 12360 v$=STR$(v%) 12370 PRINTTAB(x%+4-(LEN(v$) DIV 2),31);v$; 12380NEXT 12390ENDPROC 12400: 12410DEF PROCshow_name 12420LOCAL name 12430IF cur_obj%<>-1 THEN 12440 name=!(obj!(4*cur_obj%)+obj_name) 12450 IF name<>0 PRINTTAB(0,2)"Editing: ";:SYS "OS_Write0",name 12460ENDIF 12470ENDPROC 12480: 12490DEF PROCshow_flags 12500IF selected%<>-1 THEN 12510 IF (selected%!subobj_flags AND bit_merge) PRINTTAB(48,2)"MERGE"; 12520 IF (selected%!subobj_flags AND bit_closed) PRINTTAB(54,2)"CLOSED"; 12530ENDIF 12540ENDPROC 12550: 12560DEF PROCshow_zoom 12570LOCAL z$ 12580z$=STR$(zoom% DIV 10)+"."+STR$(zoom% MOD 10) 12590PROCleft_arrow(0,31) 12600PROCright_arrow(8,31) 12610PRINTTAB(5-LEN(z$)/2,31);z$; 12620ENDPROC 12630: 12640DEF PROCshow_obj_pos 12650LOCAL i% 12660IF selected%<>-1 THEN 12670 IF (selected%!subobj_flags AND bit_surf)>0 THEN 12680 IF vertex%<>-1 THEN 12690 FOR i%=0 TO 2 12700 v%=!(selected%!subobj_type+surf_coords+12*vertex%+4*i%) DIV 100 12710 x%=10*i% 12720 PROCleft_arrow(x%,31) 12730 PROCright_arrow(x%+8,31) 12740 v$=STR$(v%) 12750 PRINTTAB(x%+4-(LEN(v$) DIV 2),31);v$; 12760 NEXT 12770 ENDIF 12780 ELSE 12790 FOR i%=0 TO 5 12800 IF i%<3 v%=(selected%!(subobj_offset+4*i%)) DIV 100 ELSE v%=selected%!(subobj_angle+4*(i%-3)) DIV ang_scale 12810 x%=10*i% 12820 IF i%>2 x%+=5 12830 PROCleft_arrow(x%,31) 12840 PROCright_arrow(x%+8,31) 12850 v$=STR$(v%) 12860 PRINTTAB(x%+4-(LEN(v$) DIV 2),31);v$; 12870 NEXT 12880 ENDIF 12890ENDIF 12900ENDPROC 12910: 12920DEF PROCload(f$) 12930SYS "BAU3D_Load",f$,,obj,max TO world_hand,,,objects 12940obj_first=0 12950ENDPROC 12960: 12970DEF PROClist_objects 12980PROClistobj(obj_first,obj_first+24) 12990ENDPROC 13000: 13010DEF PROClistobj(from%,to%) 13020LOCAL i% 13030IF objects=0 ENDPROC 13040from%=FNmax(from%,obj_first) 13050to%=FNmin(to%,obj_first+24) 13060IF from%>to% ENDPROC 13070FOR i%=from% TO to% 13080 IF i%=cur_obj% THEN 13090 PROCcolour(yellow%) 13100 PROCcolourb(blue%) 13110 ELSE 13120 VDU 20 13130 ENDIF 13140 PRINTTAB(66,i%-obj_first+4); 13150 IF i%>=objects THEN 13160 PRINTSPC14; 13170 ELSE 13180 PRINTLEFT$(FNget_string(!(obj!(4*i%)+4))+STRING$(14," "),14); 13190 ENDIF 13200NEXT 13210PROCup_arrow(69,2) 13220PROCdown_arrow(69,30) 13230VDU 20 13240ENDPROC 13250: 13260DEF PROCshow_colour_bar 13270LOCAL i% 13280VDU 26 13290FOR i%=0 TO 2 13300 GCOL 0 TINT 0 13310 RECTANGLE FILL 16*(72+2*i%),20*32+256,16,rgb%(i%)-256 13320 GCOL (3<<(i%*2)) TINT 192 13330 RECTANGLE FILL 16*(72+2*i%),20*32,16,rgb%(i%) 13340NEXT 13350PROCgcol((rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24)) 13360RECTANGLE FILL 16*66,20*32,64,256 13370SYS "OS_SpriteOp",34+256,col_spr%,"cols",64*16,2*32 13380ENDPROC 13390: 13400DEF FNmin(a%,b%) 13410IF a%<b% THEN =a% ELSE =b% 13420: 13430DEF FNmax(a%,b%) 13440IF a%>b% THEN =a% ELSE =b% 13450: 13460DEF FNget_string(a) 13470LOCAL a$ 13480a$="" 13490WHILE ?a>=32 13500 a$+=CHR$(?a) 13510 a+=1 13520ENDWHILE 13530=a$ 13540: 13550DEF FNidentify_keyword(w$) 13560LOCAL i,found 13570IF objects<=0 THEN =-1 13580i=0 13590found=FALSE 13600WHILE i<objects AND NOT found 13610 IF FNget_string(!(obj!(4*i)+4))=w$ THEN 13620 found=TRUE 13630 ELSE 13640 i+=1 13650 ENDIF 13660ENDWHILE 13670IF NOT found THEN =-1 13680=i 13690: 13700DEF PROCleft_arrow(x%,y%) 13710x%=x%*16 13720y%=1024-32*(y%+1) 13730PROCgcol(blue%) 13740RECTANGLE FILL x%,y%,16,28 13750PROCgcol(yellow%) 13760MOVE x%+12,y%+4 13770MOVE x%+12,y%+24 13780PLOT 85,x%+4,y%+14 13790ENDPROC 13800: 13810DEF PROCright_arrow(x%,y%) 13820x%=x%*16 13830y%=1024-32*(y%+1) 13840PROCgcol(blue%) 13850RECTANGLE FILL x%,y%,16,28 13860PROCgcol(yellow%) 13870MOVE x%+4,y%+4 13880MOVE x%+4,y%+24 13890PLOT 85,x%+12,y%+14 13900ENDPROC 13910: 13920DEF PROCup_arrow(x%,y%) 13930x%=x%*16 13940y%=1024-32*(y%+1) 13950PROCgcol(blue%) 13960RECTANGLE FILL x%,y%,128,32 13970PROCgcol(yellow%) 13980MOVE x%+4,y%+4 13990MOVE x%+124,y%+4 14000PLOT 85,x%+64,y%+28 14010ENDPROC 14020: 14030DEF PROCdown_arrow(x%,y%) 14040x%=x%*16 14050y%=1024-32*(y%+1) 14060PROCgcol(blue%) 14070RECTANGLE FILL x%,y%,128,32 14080PROCgcol(yellow%) 14090MOVE x%+4,y%+28 14100MOVE x%+124,y%+28 14110PLOT 85,x%+64,y%+4 14120ENDPROC 14130: 14140DEF PROCensure_visible(i%) 14150IF i%<obj_first THEN 14160 obj_first=i% 14170ELSE 14180 IF i%>obj_first+24 obj_first=i%-24 14190ENDIF 14200ENDPROC 14210: 14220DEF PROCfind_bounding_cube(sub,RETURN x0,RETURN y0,RETURN z0,RETURN x1,RETURN y1,RETURN z1) 14230LOCAL i,x,y,z,x2,y2,z2,a,b,c 14240x0=1E10 14250y0=1E10 14260z0=1E10 14270x1=-1E10 14280y1=-1E10 14290z1=-1E10 14300a=!(sub+subobj_angle+0) 14310b=!(sub+subobj_angle+4) 14320c=!(sub+subobj_angle+8) 14330FOR i=0 TO 7 14340 x=!(sub+subobj_bounds+12*i+0) 14350 y=!(sub+subobj_bounds+12*i+4) 14360 z=!(sub+subobj_bounds+12*i+8) 14370 PROCrotate(x,y,z,a,b,c,x2,y2,z2) 14380 IF x2<x0 x0=x2 14390 IF y2<y0 y0=y2 14400 IF z2<z0 z0=z2 14410 IF x2>x1 x1=x2 14420 IF y2>y1 y1=y2 14430 IF z2>z1 z1=z2 14440NEXT 14450ENDPROC 14460: 14470DEF PROCrotate(x,y,z,a,b,c,RETURN x2,RETURN y2,RETURN z2) 14480a=RAD(a/ang_scale) 14490b=RAD(b/ang_scale) 14500c=RAD(c/ang_scale) 14510 14520x2=x 14530y2=y*COSa+z*SINa 14540z2=-y*SINa+z*COSa 14550 14560x=x2*COSb-z2*SINb 14570y=y2 14580z=x2*SINb+z2*COSb 14590 14600x2=x*COSc+y*SINc 14610y2=-x*SINc+y*COSc 14620z2=z 14630ENDPROC 14640: 14650DEF PROCkey(k%) 14660LOCAL a,surf% 14670IF k%=17 AND zoom%<100 zoom%=FNmin(zoom%+10,100):view_needs_update%=TRUE:PROCinfo_bar 14680IF k%=23 AND zoom%>10 zoom%=FNmax(zoom%-10,10):view_needs_update%=TRUE:PROCinfo_bar 14690CASE cur_mode% OF 14700 WHEN 3: 14710 PROCedit_key(k%) 14720 WHEN 4: 14730 IF k%=27 THEN 14740 verts=0 14750 view_needs_update%=TRUE 14760 ENDIF 14770ENDCASE 14780ENDPROC 14790: 14800DEF PROCedit_key(k%) 14810CASE k% OF 14820 WHEN 19: 14830 IF cur_obj%<>-1 AND cur_view%>0 THEN 14840 IF selected%=-1 THEN 14850 IF !(FNo+obj_list)=0 THEN 14860 PROCselect_object_raw(-1) 14870 ELSE 14880 PROCselect_object_raw(!(FNo+obj_list)) 14890 ENDIF 14900 PROCset_info_mode(5) 14910 ELSE 14920 IF selected%!subobj_next<>0 THEN 14930 PROCselect_object_raw(selected%!subobj_next) 14940 ELSE 14950 PROCselect_object_raw(!(FNo+obj_list)) 14960 ENDIF 14970 ENDIF 14980 PROCinfo_bar 14990 ENDIF 15000 WHEN 22: 15010 IF cur_obj%<>-1 AND cur_view%>0 AND selected%<>-1 THEN 15020 IF (selected%!subobj_flags AND bit_surf)>0 THEN 15030 vertex%=(vertex%+1) MOD !(selected%!subobj_type+surf_n) 15040 view_needs_update%=TRUE 15050 PROCinfo_bar 15060 ENDIF 15070 ENDIF 15080 WHEN 1: 15090 IF FNediting_surf THEN 15100 IF vertex%<>-1 THEN 15110 surf%=selected%!subobj_type 15120 a=surf%+surf_coords+12*vertex% 15130 CASE cur_view% OF 15140 WHEN 1: 15150 a!8+=1000 15160 WHEN 2: 15170 a!4-=1000 15180 WHEN 3: 15190 a!0-=1000 15200 ENDCASE 15210 view_needs_update%=TRUE 15220 PROCinfo_bar 15230 ENDIF 15240 ENDIF 15250 WHEN 26: 15260 IF FNediting_surf THEN 15270 IF vertex%<>-1 THEN 15280 surf%=selected%!subobj_type 15290 a=surf%+surf_coords+12*vertex% 15300 CASE cur_view% OF 15310 WHEN 1: 15320 a!8-=1000 15330 WHEN 2: 15340 a!4+=1000 15350 WHEN 3: 15360 a!0+=1000 15370 ENDCASE 15380 view_needs_update%=TRUE 15390 PROCinfo_bar 15400 ENDIF 15410 ENDIF 15420ENDCASE 15430ENDPROC 15440: 15450DEF FNo=obj!(4*cur_obj%) 15460: 15470DEF PROCsave 15480LOCAL file$,out%,i% 15490LOCAL ERROR 15500ON 15510ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:OFF:PROCmode_select(3):ENDPROC 15520INPUTTAB(0,30)"Save as: "file$ 15530file$=FNstrip(file$) 15540saved()=FALSE 15550PROCensure_there_is_a_world 15560out%=OPENOUT("objects."+file$) 15570BPUT#out%,"rem: >objects."+file$+CHR$10 15580FOR i%=0 TO objects-1 15590 PROCsave_obj(i%,out%) 15600NEXT 15610CLOSE#out% 15620OSCLI("SetType objects."+file$+" text") 15630OFF 15640RESTORE ERROR 15650PROCmode_select(3) 15660ENDPROC 15670: 15680DEF PROCsave_obj(o,out%) 15690LOCAL a,b,oo,i%,j% 15700IF saved(o) ENDPROC 15710a=obj!(4*o) 15720b=a!obj_list 15730WHILE b<>0 15740 IF (b!subobj_flags AND bit_surf)=0 THEN 15750 PROCsave_obj(FNobj_no(b!subobj_type),out%) 15760 ENDIF 15770 b=b!subobj_next 15780ENDWHILE 15790BPUT#out%,"object: "+FNget_string(a!obj_name)+CHR$10 15800b=a!obj_list 15810WHILE b<>0 15820 IF (b!subobj_flags AND bit_surf)>0 THEN 15830 oo=b!subobj_type 15840 BPUT#out%," colour: "+STR$(oo?(surf_colour+1))+","+STR$(oo?(surf_colour+2))+","+STR$(oo?(surf_colour+3))+CHR$10 15850 BPUT#out%," surface:"+CHR$10 15860 FOR i%=0 TO oo!surf_n-1 15870 BPUT#out%," "; 15880 FOR j%=0 TO 2 15890 BPUT#out%,FNfloat(oo!(surf_coords+12*i%+4*j%)/scale); 15900 IF j%<2 BPUT#out%,","; ELSE BPUT#out%,10 15910 NEXT 15920 NEXT 15930 BPUT#out%,10 15940 ELSE 15950 oo=b!subobj_type 15960 BPUT#out%," "+FNget_string(oo!obj_name)+": "; 15970 FOR i%=0 TO 2 15980 BPUT#out%,FNfloat(b!(subobj_offset+4*i%)/scale); 15990 IF i%<2 BPUT#out%,","; ELSE BPUT#out%," "; 16000 NEXT 16010 FOR i%=0 TO 2 16020 BPUT#out%,FNfloat(FNint(b!(subobj_angle+4*i%)/ang_scale)); 16030 IF i%<2 BPUT#out%,","; ELSE BPUT#out%," "; 16040 NEXT 16050 IF (b!subobj_flags AND bit_merge)>0 BPUT#out%,"merge "; 16060 IF (b!subobj_flags AND bit_closed)>0 BPUT#out%,"closed "; 16070 BPUT#out%,CHR$10 16080 ENDIF 16090 b=b!subobj_next 16100ENDWHILE 16110saved(o)=TRUE 16120ENDPROC 16130: 16140DEF FNobj_no(addr%) 16150LOCAL i% 16160i%=-1 16170REPEAT 16180 i%+=1 16190UNTIL obj!(4*i%)=addr% 16200=i% 16210: 16220DEF FNint(i)=INT(i+0.4999) 16230: 16240DEF FNfloat(f) 16250LOCAL v%,mod%,div% 16260v%=f*1000 16270mod%=v% MOD 1000 16280div%=v% DIV 1000 16290IF mod%=0 THEN =STR$(div%) 16300=STR$(div%)+"."+STR$(mod%) 16310: 16320DEF FNx(p%,n%) 16330LOCAL x,y,z,oo,x2,y2,z2,a,b,c,aa 16340IF selected%=-1 OR cur_obj%=-1 THEN =0 16350a=selected%!(subobj_angle+0) 16360b=selected%!(subobj_angle+4) 16370c=selected%!(subobj_angle+8) 16380oo=selected%!subobj_type 16390aa=oo+surf_coords+12*n% 16400x=!aa 16410y=aa!4 16420z=aa!8 16430PROCrotate(x,y,z,a,b,c,x2,y2,z2) 16440IF p%=1 THEN =(x+oxyz%(p%,0))/(scale2d/(zoom%/10)) 16450IF p%=2 THEN =(x+oxyz%(p%,0))/(scale2d/(zoom%/10)) 16460IF p%=3 THEN =(z+oxyz%(p%,0))/(scale2d/(zoom%/10)) 16470=0 16480: 16490DEF FNy(p%,n%) 16500LOCAL x,y,z,oo,x2,y2,z2,a,b,c,aa 16510IF selected%=-1 OR cur_obj%=-1 THEN =0 16520a=selected%!(subobj_angle+0) 16530b=selected%!(subobj_angle+4) 16540c=selected%!(subobj_angle+8) 16550oo=selected%!subobj_type 16560aa=oo+surf_coords+12*n% 16570x=!aa 16580y=aa!4 16590z=aa!8 16600PROCrotate(x,y,z,a,b,c,x2,y2,z2) 16610IF p%=1 THEN =(y+oxyz%(p%,1))/(scale2d/(zoom%/10)) 16620IF p%=2 THEN =(z+oxyz%(p%,1))/(scale2d/(zoom%/10)) 16630IF p%=3 THEN =(y+oxyz%(p%,1))/(scale2d/(zoom%/10)) 16640=0 16650: 16660DEF PROCclear 16670objects=0 16680SYS "BAU3D_HeapInit",heap,heap_size 16690ENDPROC 16700: 16710DEF PROCdelete 16720LOCAL a%,b% 16730LOCAL ERROR 16740ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCmode_select(3):ENDPROC 16750IF cur_obj%<>-1 AND selected%<>-1 THEN 16760 IF (selected%!subobj_flags AND bit_surf)>0 THEN 16770 SYS "BAU3D_Free",selected%!subobj_type 16780 a%=FNo+obj_list 16790 b%=!a% 16800 WHILE b%<>selected% 16810 a%=b% 16820 b%=a%!subobj_next 16830 ENDWHILE 16840 !a%=b%!subobj_next 16850 SYS "BAU3D_Free",b% 16860 ELSE 16870 a%=FNo+obj_list 16880 b%=!a% 16890 WHILE b%<>selected% 16900 a%=b% 16910 b%=a%!subobj_next 16920 ENDWHILE 16930 !a%=b%!subobj_next 16940 SYS "BAU3D_Free",b% 16950 ENDIF 16960ELSE 16970 IF INKEY-1 AND cur_obj%<>-1 THEN 16980 PROCdelete_object(cur_obj%) 16990 ENDIF 17000ENDIF 17010selected%=-1 17020view_needs_update%=TRUE 17030RESTORE ERROR 17040ENDPROC 17050: 17060DEF PROCdelete_object(o) 17070LOCAL a,was,i% 17080LOCAL ERROR 17090ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCinfo_bar:ENDPROC 17100IF FNcross_ref(o) ERROR 9999,"Object is used elsewhere" 17110a=obj!(4*o) 17120a=a!obj_list 17130WHILE !a<>0 17140 IF (a!subobj_flags AND bit_surf)>0 THEN 17150 SYS "BAU3D_Free",a!subobj_type 17160 ENDIF 17170 was=a 17180 a=a!subobj_next 17190 SYS "BAU3D_Free",was 17200ENDWHILE 17210IF o<objects-1 THEN 17220 FOR i%=o TO objects-2 17230 obj!(4*i%)=obj!(4*i%+4) 17240 NEXT 17250ENDIF 17260objects-=1 17270IF cur_obj%>=objects cur_obj%=-1 17280PROCensure_there_is_a_world 17290PROCcls_right 17300PROClist_objects 17310RESTORE ERROR 17320ENDPROC 17330: 17340DEF FNcross_ref(o) 17350LOCAL ref,i% 17360ref=FALSE 17370IF objects>0 THEN 17380 i%=0 17390 WHILE i%<objects AND NOT ref 17400 IF i%<>o THEN 17410 IF FNcheck_for_self_ref(obj!(4*i%),obj!(4*o)) ref=TRUE 17420 ENDIF 17430 i%+=1 17440 ENDWHILE 17450ENDIF 17460=ref 17470: 17480REM a is the address of an object, b is the address to check for 17490: 17500DEF FNcheck_for_self_ref(a,b) 17510LOCAL self_ref 17520self_ref=FALSE 17530a=a!obj_list 17540WHILE NOT self_ref AND a<>0 17550 IF a!subobj_type=b THEN 17560 self_ref=TRUE 17570 ELSE 17580 IF (a!subobj_flags AND bit_surf)=0 THEN 17590 IF FNcheck_for_self_ref(a!subobj_type,b) self_ref=TRUE 17600 ENDIF 17610 ENDIF 17620 IF NOT self_ref THEN a=a!subobj_next 17630ENDWHILE 17640=self_ref 17650: 17660DEF PROCcreate_object(name$) 17670LOCAL new,name 17680SYS "BAU3D_Malloc",obj_req TO new 17690SYS "BAU3D_Malloc",LEN(name$)+2 TO name 17700$name=name$+CHR$0 17710new!obj_name=name 17720new!obj_list=0 17730obj!(4*objects)=new 17740objects+=1 17750IF cur_mode%=3 PROClist_objects 17760ENDPROC 17770: 17780DEF PROCcreate 17790LOCAL new$ 17800LOCAL ERROR 17810ON ERROR LOCAL RESTORE ERROR:PROCerr_bar(TRUE):PROCmode_select(3):OFF:ENDPROC 17820ON 17830PRINTTAB(0,2)SPC60; 17840INPUTTAB(0,2)"Create object: "new$ 17850new$=FNstrip(new$) 17860IF new$<>"" PROCcreate_object(new$) 17870PROCmode_select(3) 17880OFF 17890RESTORE ERROR 17900ENDPROC 17910: 17920DEF PROCensure_there_is_a_world 17930IF FNidentify_keyword("world")=-1 PROCcreate_object("world") 17940ENDPROC
� >3Ded � A simple 3D editor � By DCA (� For 32-bit machines 2� (c) BAU October 1993 <: F� 15 P� Z *FX 229,1 d*POINTER 1 nȗ � x�init_modules � �init ��screen �ȗ was_mx%,was_my%,was_mb% �click_time%=� ��ensure_there_is_a_world �quit%=� �� � ȗ mx%,my%,mb% � repeating%=� � � mb%<>was_mb% � � was_mb%=mb% � click_time%=� � � mb%<>0 � �click(mx%,my%,mb%) � � "( � �-click_time%>repeat% � mb%<>0 � ,9 � mx%=was_mx% � my%=was_my% � my%>40 � mx%<66*16 � 6 �idle(mx%,my%,mb%) @ � J Ȗ T repeating%=� ^ �click(mx%,my%,mb%) h � r � | k%=�(0) �$ � k%=27 � (�-1 � �-2) quit%=� � � k%<>-1 � � �key(k%) � � � �idle(mx%,my%,mb%) � � � � � � � was_mx%=mx% � was_my%=my% �� quit% �� 12 � *FX 229,0 � : � �init & 0max_vert=256 :verts=0 D� v(max_vert,2) N X� col_spr% 20*1024 b!col_spr%=20*1024 lcol_spr%!4=0 vcol_spr%!8=16 �col_spr%!12=16 �9ș "OS_SpriteOp",15+256,col_spr%,"cols",,16*8,16*8,15 �+ș "OS_SpriteOp",60+256,col_spr%,"cols" �� col%=0 � 255 � � col% � 63 Ȝ col% � 192 �. ȓ Ȑ 16*(col% � 16),32*(col% � 16),16,32 �� �&ș "OS_SpriteOp",60+256,col_spr%,0 � �max=400 �� obj 4*max,saved(max) � �&heap_size=(�-�-32*1024) � (� 4095) � heap heap_size &ș "BAU3D_HeapInit",heap,heap_size dist=800:zplus=10000 *ang_scale=&10000/360 4 >!� com$(10),file$(256),rgb%(2) HScom$()="*","LOAD","SAVE","EDIT","POLY","ZOOM","CREATE","DELETE","MERGE","CLOSE" Rwhite%=&FFFFFF00 \black%=&00000000 fdark_red%=&00006000 pyellow%=&00F0F000 zblue%=&F0000000 �panel_width%=512-16 � panel_height%=(1024-180) � 2 �cur_mode%=-1 �� view_xyz 12,view_ang 12 �� oxyz%(3,2),oang%(3,2) ��init_orig �oang%(2,0)=90 �oang%(3,1)=-90 �ang_scale=&10000/360 �scale=10000 �cur_obj%=-1 �selected%=-1 �vertex%=-1 info_mode%=-1 objects=0 obj_first=0 $scale2d=5000 .cur_view%=-1 8 B9� panel_x0%(3),panel_y0%(3),panel_x1%(3),panel_y1%(3) L3panel_x0%()=0,16+panel_width%,0,16+panel_width% V(panel_x1%()=panel_x0%()+panel_width% `=panel_y0%()=40,40,40+16+panel_height%,40+16+panel_height% j)panel_y1%()=panel_y0%()+panel_height% t ~repeat%=30 �view_needs_update%=� �cur_view_needs_update%=� �zoom%=10 � �bit_merge=64 �bit_surf=128 �bit_disp=256 �bit_dispall=512 �bit_closed=1024 � �obj_list=0 �obj_name=4 obj_req=8 surf_type=0 surf_colour=4 (surf_n=8 2surf_coords=12 <surf_req=12 F Psubobj_next=0 Zsubobj_type=4 dsubobj_flags=8 nsubobj_offset=12 xsubobj_angle=24 �subobj_surfreq=36 �subobj_bounds=36 �subobj_req=132 � �� �: �� �init_modules �%*RMEnsure BAU3D 0.40 RMLoad BAU3D �G*RMEnsure ColourTrans 1.00 Error 0 3Ded requires ColourTrans module �� �: �� �init_orig � oxyz%()=0 oxyz%(0,2)=2000000 � : "� �show_commands ,� i% 6� i%=0 � 9 @ �show_command(i%) J� T� ^: h� �show_command(i%) r� x% |� 5 � x%=128*i% �2� i%=cur_mode% �gcol(blue%) � �gcol(dark_red%) �ȓ Ȑ x%,1024-44,124,40 �1� i%=cur_mode% �gcol(yellow%) � �gcol(white%) �ȓ x%,1024-44,124,40 �!� x%+64-8*�(com$(i%)),1024-12 ��;com$(i%); �� 4 �� �� �: �� �gcol(rgb%) �(ș "ColourTrans_SetGCOL",rgb%,,,&100 � : � �colour(rgb%) & � col% 0+ș "ColourTrans_ReturnGCOL",rgb% � col% : � (col%>>2) Ȝ (col% � 3)<<6 D� N: X� �colourb(rgb%) b � col% l+ș "ColourTrans_ReturnGCOL",rgb% � col% v$� 128+(col%>>2) Ȝ (col% � 3)<<6 �� �: � � �screen �� i% �� 26,20 �� �� ��show_commands ��show_panels � �info_bar �� �: �� �show_panels � i% � i%=0 � 3 �show_panel(i%) � *� 4: >� �show_panel(panel%) H� x%,y%,i% R%x%=(panel% � 2)*(panel_width%+16) \)y%=(panel% � 2)*(panel_height%+16)+40 f�gcol(black%) p*ȓ Ȑ x%,y%,panel_width%,panel_height% z5� panel%=cur_view% �gcol(yellow%) � �gcol(white%) �'ȓ x%,y%,panel_width%,panel_height% � ȑ 0,0 �8� 24,x%+2;y%+4;x%+panel_width%-2;y%+panel_height%-4; �/ȑ x%+panel_width% � 2,y%+panel_height% � 2 �� cur_obj%<>-1 � � Ȏ panel% � � � 0: � � i%=0 � 2 �# view_xyz!(4*i%)=oxyz%(0,i%) �# view_ang!(4*i%)=oang%(0,i%) � � �A ș "BAU3D_WriteConfig",%110,dist,zplus,-zplus*0.8,10000000 �; ș "BAU3D_Render",obj!(4*cur_obj%),view_xyz,view_ang � 1,2,3:�view_2d(panel%) � � $� 26 .� 8� B: L� �view_2d(p%) VE� i%,x0,x1,y0,y1,xmin,ymin,zmin,xmax,ymax,zmax,ox,oy,oz,aa,ao,x,y `� surf% j� i%=0 � 2 t! view_xyz!(4*i%)=oxyz%(p%,i%) ~+ view_ang!(4*i%)=ang_scale*oang%(p%,i%) �� �>ș "BAU3D_WriteConfig",%110,dist,zplus,-10000000,100000000 �Mș "BAU3D_Render2D",obj!(4*cur_obj%),view_xyz,view_ang,scale2d*(10/zoom%) �� selected%<>-1 � � �gcol(white%) �. � (selected%!subobj_flags � bit_surf)>0 � �! surf%=selected%!subobj_type � coords%=surf%+surf_coords � �gcol(white%) � � �x(p%,0),�y(p%,0) �" � i%=surf%!surf_n-1 � 0 � -1 � � �x(p%,i%),�y(p%,i%) � � i%=0 � surf%!surf_n-1 2 � i%=vertex% �gcol(yellow%) � �gcol(white%) ' ȓ �x(p%,i%)-8,�y(p%,i%)-8,16,16 ( � 2 � <B �find_bounding_cube(selected%,xmin,ymin,zmin,xmax,ymax,zmax) F ao=selected%+subobj_offset P aa=selected%+subobj_angle Z ox=!ao d oy=ao!4 n oz=ao!8 x Ȏ p% � � � 1: � x0=xmin+ox � y0=ymin+oy � x1=xmax+ox � y1=ymax+oy � � 2: � x0=xmin+ox � y0=zmin+oz � x1=xmax+ox � y1=zmax+oz � � 3: � x0=zmin+oz � y0=ymin+oy x1=zmax+oz y1=ymax+oy � ". x0=(oxyz%(p%,0)+x0)/(scale2d/(zoom%/10)) ,. x1=(oxyz%(p%,0)+x1)/(scale2d/(zoom%/10)) 6. y0=(oxyz%(p%,1)+y0)/(scale2d/(zoom%/10)) @. y1=(oxyz%(p%,1)+y1)/(scale2d/(zoom%/10)) J ȓ x0,y0,x1-x0,y1-y0 T � ^� h� cur_mode%=4 � r � verts>0 � | �gcol(white%) � � i%=0 � verts-1 � Ȏ p% � � � 1: �5 x=(oxyz%(p%,0)+v(i%,0))/(scale2d/(zoom%/10)) �5 y=(oxyz%(p%,1)+v(i%,1))/(scale2d/(zoom%/10)) � � 2: �5 x=(oxyz%(p%,0)+v(i%,0))/(scale2d/(zoom%/10)) �5 y=(oxyz%(p%,1)+v(i%,2))/(scale2d/(zoom%/10)) � � 3: �5 x=(oxyz%(p%,0)+v(i%,2))/(scale2d/(zoom%/10)) �5 y=(oxyz%(p%,1)+v(i%,1))/(scale2d/(zoom%/10)) � � � ȏ Ȑ x,y,4 � � � &� 0: :� �click(mx%,my%,mb%) D� file% N� my%>=1024-44 � X �mode_select(mx% � 128) b� l Ȏ cur_mode% � v � 1: �! file%=�which_file(mx%,my%) � � file%<>-1 � � �clear �& �load("objects."+file$(file%)) �/ �select_obj(�identify_keyword("world")) � �mode_select(3) � � � � 3: � �draw_click(mx%,my%,mb%) � � 4: � �poly_click(mx%,my%,mb%) � � 5: � �zoom_click(mx%,my%) � � � : *� �select_obj(new%) 46� new%>objects-1 new%=objects-1 � � new%<0 new%=-1 >cur_obj%=new% Hselected%=-1 R�init_orig \,� cur_obj%<>-1 �ensure_visible(cur_obj%) f �info_bar p� z: �� �zoom_click(mx%,my%) � � pos% �� my%<40 � � pos%=mx% � 16 �A � pos%=0 � zoom%>10 zoom%-=1:�info_bar:view_needs_update%=� �A � pos%=8 � zoom%<100 zoom%+=1:�info_bar:view_needs_update%=� �� � �mode_select(3) �� �� �: �� �poly_click(mx%,my%,mb%) �� �pan(mx%,my%,mb%) � &� �check_for_colour(mx%,my%,mb%) � *� �check_for_add_vertex(mx%,my%,mb%) � � $: .(� �check_for_add_vertex(mx%,my%,mb%) 8� ok%,i%,x,y,z B� mx%>66*16 � =� L� my%<40 � =� V ok%=� `i%=1 jȕ i%<4 � � ok% t/ � mx%>=panel_x0%(i%) � mx%<panel_x1%(i%) � ~0 � my%>=panel_y0%(i%) � my%<panel_y1%(i%) � � � i%<>cur_view% � � cur_view%=i% � view_needs_update%=� � � �* mx%-=(panel_x0%(i%)+panel_width%/2) �+ my%-=(panel_y0%(i%)+panel_height%/2) � Ȏ mb% � � � 1: � �done_polygon � � 4: � Ȏ cur_view% � � � 1: 6 x=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) 6 y=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) z=0 � 2: (6 x=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) 2 y=0 <6 z=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) F � 3: P x=0 Z6 y=my%*scale2d*(10/zoom%)-oxyz%(cur_view%,1) d6 z=mx%*scale2d*(10/zoom%)-oxyz%(cur_view%,0) n � x v(verts,0)=x � v(verts,1)=y � v(verts,2)=z � verts+=1 �' � verts=max_vert �done_polygon � view_needs_update%=� � � � ok%=� � � � � � i%+=1 �� �=ok% �: � �done_polygon � new_surf%,new_sub%,i%,a � verts>=3 � "4 ș "BAU3D_Malloc",surf_req+12*verts � new_surf% , new_surf%!surf_type=0 6C new_surf%!surf_colour=(rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24) @ new_surf%!surf_n=verts J � i%=0 � verts-1 T# a=new_surf%+surf_coords+12*i% ^ !a=v(i%,0) h a!4=v(i%,1) r a!8=v(i%,2) | � �, ș "BAU3D_Malloc",subobj_req � new_sub% �# new_sub%!subobj_flags=bit_surf �# new_sub%!subobj_type=new_surf% � � i%=0 � 2 �% new_sub%!(subobj_offset+4*i%)=0 �$ new_sub%!(subobj_angle+4*i%)=0 � � � � !(�o+obj_list)=0 � � new_sub%!subobj_next=0 � !(�o+obj_list)=new_sub% � � � a=!(�o+obj_list) � ȕ a!subobj_next<>0 a=a!subobj_next � new_sub%!subobj_next=0 & a!subobj_next=new_sub% 0 � :� Dview_needs_update%=� Nverts=0 X� b: l� �draw_click(mx%,my%,mb%) v/� �check_for_click_on_vertex(mx%,my%,mb%) � �)� �check_for_name_edit(mx%,my%,mb%) � �&� �check_for_colour(mx%,my%,mb%) � �� �drag_obj(mx%,my%,mb%) � �� �drag_v(mx%,my%,mb%) � �� �pan(mx%,my%,mb%) � �*� �check_for_insert_obj(mx%,my%,mb%) � �%� my%<40 �offset_click(mx%,my%):� �-� mx%>66*16 �objlist_click(mx%,my%,mb%):� �� repeating% � �� cur_view%=-1 � � �try_new_panel(mx%,my%) �� �r � mx%<panel_x0%(cur_view%) � mx%>panel_x1%(cur_view%) � my%<panel_y0%(cur_view%) � my%>panel_y1%(cur_view%) � �try_new_panel(mx%,my%) � * � mb%<>2 �select_object(mx%,my%,mb%) � *� 4� >: H-� �check_for_click_on_vertex(mx%,my%,mb%) R� i%,ok%,surf%,j%,x%,y% \� IF INKEY-1 THEN =FALSE f� my%<40 � mx%>66*16 � =� p� � �editing_surf � =� z� repeating% � =� �%� cur_obj%=-1 � selected%=-1 � =� �0� (selected%!subobj_flags � bit_surf)=0 � =� �surf%=selected%!subobj_type � ok%=� �i%=1 �ȕ i%<4 � � ok% �/ � mx%>=panel_x0%(i%) � mx%<panel_x1%(i%) � �0 � my%>=panel_y0%(i%) � my%<panel_y1%(i%) � �, x%=mx%-(panel_x0%(i%)+panel_width%/2) �- y%=my%-(panel_y0%(i%)+panel_height%/2) � � j%=0 � surf%!surf_n-1 � � �(x%-�x(i%,j%))<32 � � � �(y%-�y(i%,j%))<32 � ok%=� vertex%=j% view_needs_update%=� $ � . � 8 � B � L � V i%+=1 `� j� � ok% � vertex%<>1 � t vertex%=-1 ~ ok%=� � view_needs_update%=� � �try_new_panel(mx%,my%) �� � �info_bar �=ok% �: �(� �check_for_insert_obj(mx%,my%,mb%) �0� x%,y%,b%,obj_to_drag%,x2%,y2%,drag$,ok%,i% �� � �&� � � � �:�err_bar(�):�info_bar:=� �� �editing_surf � � �:=� �/� � ((mb%=4 � mb%=1) � repeating%) � � �:=� � mx%<66*16 � � �:=� y%=31-(my% � 32) � y%<4 � y%>28 � � �:=� obj_to_drag%=obj_first+y%-4 (5� obj_to_drag%<0 � obj_to_drag%>=objects � � �:=� 27drag$=�get_string(!(obj!(4*obj_to_drag%)+obj_name)) <ȗ x%,y%,b% F� 5 P� 4,63 Ȝ 192 Z�show_drag d� n ȗ x2%,y2%,b% x � x2%<>x% � y2%<>y% � � �show_drag � x%=x2% � y%=y2% � �show_drag � � � � b%=0 ��show_drag �� 4 �� �b� �check_for_self_ref(obj!(4*obj_to_drag%),obj!(4*cur_obj%)) � � 9999,"Illegal self-reference" � ok%=� �� i%=1 � 3 �T � x%>=panel_x0%(i%) � x%<panel_x1%(i%) � y%>=panel_y0%(i%) � y%<panel_y1%(i%) � ok%=� + �insert_an_obj(obj_to_drag%,i%,x%,y%) i%=3 " � ,� 6� � @=ok% J: T"� �insert_an_obj(o,p%,mx%,my%) ^� new,a h� cur_obj%=-1 � � r&ș "BAU3D_Malloc",subobj_req � new |a=obj!(4*cur_obj%) �new!subobj_next=a!obj_list �a!obj_list=new �new!(subobj_angle+0)=0 �new!(subobj_angle+4)=0 �new!(subobj_angle+8)=0 �'mx%-=(panel_x0%(p%)+panel_width%/2) �(my%-=(panel_y0%(p%)+panel_height%/2) �Ȏ p% � � � 1: �> new!(subobj_offset+0)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) �> new!(subobj_offset+4)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) � new!(subobj_offset+8)=0 � � 2: > new!(subobj_offset+0)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) new!(subobj_offset+4)=0 > new!(subobj_offset+8)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) & � 3: 0 new!(subobj_offset+0)=0 :> new!(subobj_offset+4)=my%*scale2d*(10/zoom%)-oxyz%(p%,1) D> new!(subobj_offset+8)=mx%*scale2d*(10/zoom%)-oxyz%(p%,0) N X new!(subobj_offset+0)=0 b new!(subobj_offset+4)=0 l new!(subobj_offset+8)=0 v� �new!subobj_type=obj!(4*o) �new!subobj_flags=0 �*ș "BAU3D_CalcBounds",obj!(4*cur_obj%) �view_needs_update%=� �� �: �� �show_drag �Ȗ �� x%-8*�(drag$),y%+8 ��;drag$; �� �: �'� �check_for_name_edit(mx%,my%,mb%) � was$,o,name � � (� � � � �:�err_bar(�):�info_bar:�:=� � cur_mode%<>3 � � �:=� *� cur_obj%=-1 � � �:=� 4o=obj!(4*cur_obj%) >,� my%<1024-3*32 � my%>1024-2*32 � � �:=� H� mx%>60*16 � � �:=� R9� o!obj_name>0 was$=�get_string(o!obj_name) � was$="" \� f�0,2)�60; p�0,2)"New name: "; z *FX 15 ��ins(was$) ��""new$ �!new$=�lc_and_us(�strip(new$)) �� new$<>"" � �' ș "BAU3D_Malloc",�(new$)+2 � name � $name=new$+�0 � ș "BAU3D_Free",o!obj_name � o!obj_name=name � �info_bar � �list_objects �� �� �� � =� : $� �check_for_colour(mx%,my%,mb%) $� i%,ok%,col%,tint% .*� � (�editing_surf � cur_mode%=4) � =� 8� mx%<64*16 � =� B ok%=� LA� mx%>=64*16 � mx%<64*16+16*16 � my%>=2*32 � my%<2*32+16*32 � V ok%=� ` col%=�mx%,my%) j tint%=Ȝ(mx%,my%) t � i%=0 � 2 ~5 rgb%(i%)=(((col%>>(i%*2)) � 3)<<6) � (tint%>>2) � � � �show_colour_bar �� �) � my%>=20*32-16 � my%<20*32+256+16 � � � i%=0 � 2 �1 � mx%>=72*16+32*i% � mx%<=72*16+32*i%+16 � � rgb%(i%)=my%-20*32 �= � rgb%(i%)<0 rgb%(i%)=0 � � rgb%(i%)>255 rgb%(i%)=255 � ok%=� � �show_colour_bar � � � � � � � ok% � � �editing_surf � (/ � (selected%!subobj_flags � bit_surf)>0 � 2T !(selected%!subobj_type+surf_colour)=(rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24) < view_needs_update%=� F � P � Z� d=ok% n: x� �err_bar(can_esc%) � � wait �� can_esc% � �=17 � � � %11 ��0,31)�79; ��0,31);�$; �� �<>9999 �"' at line ";�; ��" - press a key"; �� 20 � *FX 15 � wait=� �� �: �� �ins(i$) � i% � i$="" � � i%=1 � �(i$) " ș "OS_Byte",138,0,��i$,i%) ,� 6� @: J� �strip(a$) Tȕ �(a$)=32 ^ a$=�a$,2) h� rȕ �a$)=" " | a$=�a$) �� �=a$ �: � � �lc(a$) �� b$,i%,c% � b$="" �� a$<>"" � � � i%=1 � �(a$) � c%=��a$,i%) �$ � c%>=�"A" � c%<=�"Z" � c%+=32 � b$+=�c% � � �� =b$ : � �lc_and_us(a$) &� b$,i%,c% 0 b$="" :� a$<>"" � D � i%=1 � �(a$) N c%=��a$,i%) X$ � c%>=�"A" � c%<=�"Z" � c%+=32 b � c%=32 c%=�"_" l b$+=�c% v � �� �=b$ �: �!� �select_object(mx%,my%,mb%) �� p%,loop%,ok% �� cur_obj%=-1 � �� cur_view%<=0 � �� selected%<>-1 � mb%=1 � � �� selected%=-1 � � loop%=!(�o+obj_list) �� � loop%=selected% �� p%=loop%!subobj_next � p%=0 � p%=!(�o+obj_list) ok%=� ȕ p%<>loop% � � ok% * � p%<>0 � 46 ok%=�:� should compare co-ordinates here ideally > � H p%=p%!subobj_next R � p%=0 � p%=!(�o+obj_list) \ � f� p � � ok% � z � !(�o+obj_list)=0 � � �select_object_raw(-1) � � �( �select_object_raw(!(�o+obj_list)) � � �� � �select_object_raw(p%) �� �� �: �� �select_object_raw(addr%) �� i% �� addr%<>selected% � � selected%=addr% vertex%=0 view_needs_update%=� �set_info_mode(5) $� .� selected%<>-1 � 8. � (selected%!subobj_flags � bit_surf)>0 � B � i%=0 � 2 L9 rgb%(i%)=?(selected%!subobj_type+surf_colour+1+i%) V � ` �cls_right j �show_colour_bar t � ~ �cls_right � �list_objects � � �� �� �: �� �pan(mx%,my%,mb%) � � dx%,dy% �!� � (mb%=2 � repeating%) � =� �(dx%=(mx%-was_mx%)*scale2d*(10/zoom%) �(dy%=(my%-was_my%)*scale2d*(10/zoom%) �Ȏ cur_view% � � � 0,1,2,3: oxyz%(cur_view%,0)+=dx% oxyz%(cur_view%,1)+=dy% cur_view_needs_update%=� �info_bar (� 2=� <: F� �drag_obj(mx%,my%,mb%) P� dx%,dy%,o ZQ� � ((mb%=4 � mb%=1) � repeating% � cur_obj%<>-1 � selected%<>-1� � �-1) � =� d� my%<40 � =� n� mx%>66*16 � =� x0� (selected%!subobj_flags � bit_surf)>0 � =� �(dx%=(mx%-was_mx%)*scale2d*(10/zoom%) �(dy%=(my%-was_my%)*scale2d*(10/zoom%) �o=selected%+subobj_offset �Ȏ cur_view% � � � 1: � o!0+=dx% � o!4+=dy% � � 2: � o!0+=dx% � o!8+=dy% � � 3: � o!8+=dx% � o!4+=dy% � �info_bar view_needs_update%=� "=� ,: 6� �drag_v(mx%,my%,mb%) @� dx%,dy%,o JJ� � ((mb%=1 � mb%=4) � repeating% � cur_obj%<>-1 � selected%<>-1) � =� T� my%<40 � =� ^� mx%>66*16 � =� h0� (selected%!subobj_flags � bit_surf)=0 � =� r(dx%=(mx%-was_mx%)*scale2d*(10/zoom%) |(dy%=(my%-was_my%)*scale2d*(10/zoom%) �2o=selected%!subobj_type+surf_coords+12*vertex% �Ȏ cur_view% � � � 1: � o!0+=dx% � o!4+=dy% � � 2: � o!0+=dx% � o!8+=dy% � � 3: � o!8+=dx% � o!4+=dy% �� � �info_bar view_needs_update%=� =� : &� �offset_click(mx%,my%) 0� pos%,shift%,a%,ang_shift% :shift%=100 Dang_shift%=ang_scale N,� �-1 shift%=1000:ang_shift%=5*ang_scale X.� �-2 shift%=10000:ang_shift%=10*ang_scale b Ȏ � � l" � cur_mode%=3 � selected%=-1: v � cur_view%<>-1 � � pos%=mx% � 16 � Ȏ pos% � � � 0,10,20: �+ oxyz%(cur_view%,pos% � 10)-=shift% �! cur_view_needs_update%=� � �info_bar � � 8,18,28: �/ oxyz%(cur_view%,(pos%-8) � 10)+=shift% �! cur_view_needs_update%=� � �info_bar � � 35,45,55: �] oang%(cur_view%,(pos%-35) � 10)=(oang%(cur_view%,(pos%-35) � 10)-ang_shift%) � &FFFF �! cur_view_needs_update%=� ! �info_bar ! � 43,53,63: !] oang%(cur_view%,(pos%-35) � 10)=(oang%(cur_view%,(pos%-35) � 10)+ang_shift%) � &FFFF ! ! cur_view_needs_update%=� !* �info_bar !4 !>O � (pos%>=2 � pos%<=6) � (pos%>=12 � pos%<=16) � (pos%>=22 � pos%<=26) � !H � cur_view%>0 � !R �input_view_offs !\ � !f �input_view_offs_3D !p � !z � !�R � (pos%>=37 � pos%<=41) � (pos%>=47 � pos%<=51) � (pos%>=57 � pos%<=61) � !� � cur_view%=0 � !� �input_view_angs_3D !� � !� � !� � !� � !� � !�5 � cur_mode%=3 � selected%<>-1 � � �editing_surf: !� pos%=mx% � 16: !� Ȏ pos% � !� � 0,10,20: !�7 selected%!(subobj_offset+4*(pos% � 10))-=shift% " view_needs_update%=� " �info_bar " � 8,18,28: "$7 selected%!(subobj_offset+4*(pos% � 10))+=shift% ". view_needs_update%=� "8 �info_bar "B �update_bounds "L � 35,45,55: "V4 a%=selected%+subobj_angle+4*((pos%-35) � 10) "`$ !a%=(!a%-ang_shift%) � &FFFF "j view_needs_update%=� "t �info_bar "~ �update_bounds "� � 43,53,63: "�4 a%=selected%+subobj_angle+4*((pos%-43) � 10) "�$ !a%=(!a%+ang_shift%) � &FFFF "� view_needs_update%=� "� �info_bar "� �update_bounds "� "�O � (pos%>=2 � pos%<=6) � (pos%>=12 � pos%<=16) � (pos%>=22 � pos%<=26) � "� �input_obj_offs "� � "�R � (pos%>=37 � pos%<=41) � (pos%>=47 � pos%<=51) � (pos%>=57 � pos%<=61) � "� �input_obj_angs # � # � # � # � �editing_surf: #( � vertex%=-1 � #2 � #< pos%=mx% � 16 #F Ȏ pos% � #P � 0,10,20: #ZM !(selected%!subobj_type+surf_coords+12*vertex%+4*(pos% � 10))-=shift% #d view_needs_update%=� #n �info_bar #x � 8,18,28: #�N !(selected%!subobj_type+surf_coords+12*vertex%+4*(pos% � 10))+=shift% #� view_needs_update%=� #� �info_bar #� �update_bounds #� #�O � (pos%>=2 � pos%<=6) � (pos%>=12 � pos%<=16) � (pos%>=22 � pos%<=26) � #� �input_vertex #� � #� � #� � #�� #�� #�: $� �input_view_offs $� � $%� � � � �:�err_bar(�):�info_bar:� $"4�input("X screen offset",oxyz%(cur_view%,0),100) $, �info_bar $64�input("Y screen offset",oxyz%(cur_view%,1),100) $@ �info_bar $Jcur_view_needs_update%=� $T� � $^� $h: $r� �input_view_offs_3D $|� � $�%� � � � �:�err_bar(�):�info_bar:� $�-�input("X offset",oxyz%(cur_view%,0),100) $� �info_bar $�-�input("Y offset",oxyz%(cur_view%,1),100) $� �info_bar $�-�input("Z offset",oxyz%(cur_view%,2),100) $� �info_bar $�cur_view_needs_update%=� $�� � $�� $�: $�� �input_view_angs_3D $�� � %%� � � � �:�err_bar(�):�info_bar:� %=�input("angle about X axis",oang%(cur_view%,0),ang_scale) % �info_bar %&=�input("angle about Y axis",oang%(cur_view%,1),ang_scale) %0 �info_bar %:=�input("angle about Z axis",oang%(cur_view%,2),ang_scale) %D �info_bar %Ncur_view_needs_update%=� %X� � %b� %l: %v� �input_obj_offs %�� � %�%� � � � �:�err_bar(�):�info_bar:� %�6�input("X offset",selected%!(subobj_offset+0),100) %� �info_bar %�6�input("Y offset",selected%!(subobj_offset+4),100) %� �info_bar %�6�input("Z offset",selected%!(subobj_offset+8),100) %� �info_bar %�view_needs_update%=� %�� � %�� %�: %�� �input_obj_angs &� � &%� � � � �:�err_bar(�):�info_bar:� &E�input("angle about X axis",selected%!(subobj_angle+0),ang_scale) & �info_bar &*E�input("angle about Y axis",selected%!(subobj_angle+4),ang_scale) &4 �info_bar &>E�input("angle about Z axis",selected%!(subobj_angle+8),ang_scale) &H �info_bar &Rview_needs_update%=� &\� � &f� &p: &z� �input_vertex &�� � &�%� � � � �:�err_bar(�):�info_bar:� &�L�input("vertex X",!(selected%!subobj_type+surf_coords+12*vertex%+0),100) &� �info_bar &�L�input("vertex Y",!(selected%!subobj_type+surf_coords+12*vertex%+4),100) &� �info_bar &�L�input("vertex Z",!(selected%!subobj_type+surf_coords+12*vertex%+8),100) &� �info_bar &�view_needs_update%=� &�� � &�� &�: &�� �input(inp$,� v%,scale) '� � '� � � � �:�err_bar(�):�:� '� '$$�0,2)�60�0,2)"Enter "inp$;": "; '. *FX 15 '8�ins(�float(v%/scale)) 'B�""v 'Lv%=v*scale 'V� '`� � 'j� 't: '~� �editing_surf '�� selected%=-1 � =� '�*=(selected%!subobj_flags � bit_surf)>0 '�: '�� �update_bounds '�8� cur_obj%<>0 ș "BAU3D_CalcBounds",obj!(4*cur_obj%) '�� '�: '�!� �objlist_click(mx%,my%,mb%) '�� x%,y% '�y%=31-(my% � 32) '�x%=mx% � 16 '�� y%=2 � ( % � x%>=69 � x%<77 � obj_first>0 � ( obj_first-=1 (. ȓ 66*16,4*32,14*16,24*32-4 � 66*16,3*32 (# �listobj(obj_first,obj_first) (( � (2� (< � y%=30 � (F/ � x%>=69 � x%<77 � obj_first+25<objects � (P obj_first+=1 (Z/ ȓ 66*16,3*32,14*16,24*32-4 � 66*16,4*32 (d* �listobj(obj_first+24,obj_first+24) (n � (x � (� � mb%=2 � (� � y%>=4 � y%<=28 � (�# �select_obj(obj_first+y%-4) (� �list_objects (� view_needs_update%=� (� � (� � (� � (�� (�� (�: (�� �try_new_panel(mx%,my%) (�� i% )� i%=0 � 3 )g � mx%>=panel_x0%(i%) � mx%<panel_x1%(i%) � my%>=panel_y0%(i%) � my%<panel_y1%(i%) �select_view(i%) )� )"� ),: )6� �select_view(v%) )@cur_view%=v% )Jselected%=-1 )T�show_panels )^�set_info_mode(cur_view%) )h� )r: )|� �find_elem(a$(),b$) )�� i% )�i%=0 )�ȕ b$<>a$(i%) )� i%+=1 )�� )�=i% )�: )�� �idle(mx%,my%,mb%) )�� i% )�Ȏ cur_mode% � )� � 3,4,5: )� � cur_view_needs_update% � )� �show_panel(cur_view%) * cur_view_needs_update%=� * � * � view_needs_update% � *& � i%=0 � 3 *0 �show_panel(i%) *: � *D view_needs_update%=� *N � *X� *b� *l: *v� �toggle(bit) *�� selected%<>-1 � *�8 selected%!subobj_flags=selected%!subobj_flags � bit *� �info_bar *� view_needs_update%=� *�� *�� *�: *�� �mode_select(mode%) *�� mode%=7 � �delete:� *�$� mode%=8 � �toggle(bit_merge):� *�%� mode%=9 � �toggle(bit_closed):� *��mode_deselect(cur_mode%) *�cur_mode%=mode% +�show_command(cur_mode%) +selected%=-1 +Ȏ cur_mode% � + � 0: +* �cls +4 �catalogue +> � 1: +H �cls +R �catalogue +\ � 2: +f �cls +p �catalogue +z �save +� � 3: +� �cls +� �set_info_mode(cur_view%) +� �show_panels +� �list_objects +� �info_bar +� � 4: +� � cur_obj%=-1 � +� �mode_select(3) +� � +� �cls +� �set_info_mode(cur_view%) +� �show_panels , rgb%()=&FF,&FF,&FF , �show_colour_bar , �info_bar ,$ verts=0 ,. � ,8 � 5: ,B �set_info_mode(4) ,L �info_bar ,V � 6: ,` �create ,j �info_bar ,t� ,~� ,�: ,�� �mode_deselect(mode%) ,�� i% ,�� cur_mode%=-1 � ,�i%=cur_mode% ,�cur_mode%=-1 ,��show_command(i%) ,�� ,�: ,�� �catalogue ,�� dir$,cat% ,�dir$="Objects" - ș "BAU3D_Malloc",256 � cat% - p%=0 -files%=0 -done%=� -(ȕ � done% -28 ș "OS_GBPB",9,dir$,cat%,1,p%,256,"*" � ,,,read%,p% -< done%=read%=0 � p%=-1 -F � � done% � -P i%=0 -Z ȕ cat%?i%>32 -d i%+=1 -n � -x cat%?i%=13 -� file$(files%)=$cat% -� files%+=1 -� � -�� -�� files%=0 � -� �warn("No files to load") -� �mode_select(3) -�� -� � i%=0 � files%-1 -�- � �12*(i% � 6),3+2*(i% � 6));file$(i%); -� � -�� -�ș "BAU3D_Free",cat% .� .: .� �which_file(mx%,my%) ." � select%,i%,x0%,x1%,y0%,y1% .,select%=-1 .6� i%=0 � files%-1 .@ x0%=12*16*(i% � 6) .J y0%=1024-4*32-64*(i% � 6) .T x1%=x0%+16*�(file$(i%)) .^ y1%=y0%+32 .hE � mx%>=x0% � mx%<=x1% � my%>=y0% � my%<=y1% select%=i%:i%=files% .r� .|=select% .�: .�� �warn(warn$) .�� .�: .� � �cls .��gcol(black%) .�ȓ Ȑ 0,0,1279,1024-48 .�� .�: .�� �cls_right .��gcol(black%) .�ȓ Ȑ 64*16,0,16*16,1024-48 .�� /: /� �set_info_mode(new%) /� new%<>info_mode% � /& info_mode%=new% /0 �0,31)�79; /: �info_bar /D� /N� /X: /b� �info_bar /l�0,31)�79;�0,2);�60; /v�show_name /��show_flags /�Ȏ info_mode% � /� � 0,1,2,3: /�% �show_orig_and_angs(info_mode%) /� � 4: /� �show_zoom /� � 5: /� �show_obj_pos /�� /�� /�: /�� �show_orig_and_angs(p%) /�� i%,x%,v%,v$,n% 0� p%=0 n%=5 � n%=1 0� i%=0 � n% 0? � i%<3 v%=oxyz%(p%,i%) � 100 � v%=oang%(p%,i%-3)/ang_scale 0 x%=10*i% 0* � i%>2 x%+=5 04 �left_arrow(x%,31) 0> �right_arrow(x%+8,31) 0H v$=�(v%) 0R �x%+4-(�(v$) � 2),31);v$; 0\� 0f� 0p: 0z� �show_name 0� � name 0�� cur_obj%<>-1 � 0�& name=!(obj!(4*cur_obj%)+obj_name) 0�5 � name<>0 �0,2)"Editing: ";:ș "OS_Write0",name 0�� 0�� 0�: 0�� �show_flags 0�� selected%<>-1 � 0�; � (selected%!subobj_flags � bit_merge) �48,2)"MERGE"; 0�= � (selected%!subobj_flags � bit_closed) �54,2)"CLOSED"; 0�� 0�� 1: 1� �show_zoom 1� z$ 1$&z$=�(zoom% � 10)+"."+�(zoom% � 10) 1.�left_arrow(0,31) 18�right_arrow(8,31) 1B�5-�(z$)/2,31);z$; 1L� 1V: 1`� �show_obj_pos 1j� i% 1t� selected%<>-1 � 1~. � (selected%!subobj_flags � bit_surf)>0 � 1� � vertex%<>-1 � 1� � i%=0 � 2 1�E v%=!(selected%!subobj_type+surf_coords+12*vertex%+4*i%) � 100 1� x%=10*i% 1� �left_arrow(x%,31) 1� �right_arrow(x%+8,31) 1� v$=�(v%) 1�" �x%+4-(�(v$) � 2),31);v$; 1� � 1� � 1� � 1� � i%=0 � 5 2 j � i%<3 v%=(selected%!(subobj_offset+4*i%)) � 100 � v%=selected%!(subobj_angle+4*(i%-3)) � ang_scale 2 x%=10*i% 2 � i%>2 x%+=5 2 �left_arrow(x%,31) 2( �right_arrow(x%+8,31) 22 v$=�(v%) 2<! �x%+4-(�(v$) � 2),31);v$; 2F � 2P � 2Z� 2d� 2n: 2x� �load(f$) 2�6ș "BAU3D_Load",f$,,obj,max � world_hand,,,objects 2�obj_first=0 2�� 2�: 2�� �list_objects 2�$�listobj(obj_first,obj_first+24) 2�� 2�: 2�� �listobj(from%,to%) 2�� i% 2�� objects=0 � 2�from%=�max(from%,obj_first) 2�to%=�min(to%,obj_first+24) 3� from%>to% � 3� i%=from% � to% 3 � i%=cur_obj% � 3" �colour(yellow%) 3, �colourb(blue%) 36 � 3@ � 20 3J � 3T �66,i%-obj_first+4); 3^ � i%>=objects � 3h �14; 3r � 3|2 �get_string(!(obj!(4*i%)+4))+�14," "),14); 3� � 3�� 3��up_arrow(69,2) 3��down_arrow(69,30) 3�� 20 3�� 3�: 3�� �show_colour_bar 3�� i% 3�� 26 3�� i%=0 � 2 3� � 0 Ȝ 0 3�1 ȓ Ȑ 16*(72+2*i%),20*32+256,16,rgb%(i%)-256 4 � (3<<(i%*2)) Ȝ 192 4) ȓ Ȑ 16*(72+2*i%),20*32,16,rgb%(i%) 4� 4&3�gcol((rgb%(0)<<8)+(rgb%(1)<<16)+(rgb%(2)<<24)) 40ȓ Ȑ 16*66,20*32,64,256 4:6ș "OS_SpriteOp",34+256,col_spr%,"cols",64*16,2*32 4D� 4N: 4X� �min(a%,b%) 4b� a%<b% � =a% � =b% 4l: 4v� �max(a%,b%) 4�� a%>b% � =a% � =b% 4�: 4�� �get_string(a) 4�� a$ 4� a$="" 4� ȕ ?a>=32 4� a$+=�(?a) 4� a+=1 4�� 4�=a$ 4�: 4�� �identify_keyword(w$) 4� � i,found 5� objects<=0 � =-1 5i=0 5found=� 5 ȕ i<objects � � found 5*' � �get_string(!(obj!(4*i)+4))=w$ � 54 found=� 5> � 5H i+=1 5R � 5\� 5f� � found � =-1 5p=i 5z: 5�� �left_arrow(x%,y%) 5�x%=x%*16 5�y%=1024-32*(y%+1) 5��gcol(blue%) 5�ȓ Ȑ x%,y%,16,28 5��gcol(yellow%) 5�� x%+12,y%+4 5�� x%+12,y%+24 5�� 85,x%+4,y%+14 5�� 5�: 5�� �right_arrow(x%,y%) 5�x%=x%*16 6y%=1024-32*(y%+1) 6�gcol(blue%) 6ȓ Ȑ x%,y%,16,28 6$�gcol(yellow%) 6.� x%+4,y%+4 68� x%+4,y%+24 6B� 85,x%+12,y%+14 6L� 6V: 6`� �up_arrow(x%,y%) 6jx%=x%*16 6ty%=1024-32*(y%+1) 6~�gcol(blue%) 6�ȓ Ȑ x%,y%,128,32 6��gcol(yellow%) 6�� x%+4,y%+4 6�� x%+124,y%+4 6�� 85,x%+64,y%+28 6�� 6�: 6�� �down_arrow(x%,y%) 6�x%=x%*16 6�y%=1024-32*(y%+1) 6��gcol(blue%) 6�ȓ Ȑ x%,y%,128,32 7 �gcol(yellow%) 7 � x%+4,y%+28 7� x%+124,y%+28 7� 85,x%+64,y%+4 7(� 72: 7<� �ensure_visible(i%) 7F� i%<obj_first � 7P obj_first=i% 7Z� 7d& � i%>obj_first+24 obj_first=i%-24 7n� 7x� 7�: 7�<� �find_bounding_cube(sub,� x0,� y0,� z0,� x1,� y1,� z1) 7�� i,x,y,z,x2,y2,z2,a,b,c 7�x0=1E10 7�y0=1E10 7�z0=1E10 7�x1=-1E10 7�y1=-1E10 7�z1=-1E10 7�a=!(sub+subobj_angle+0) 7�b=!(sub+subobj_angle+4) 7�c=!(sub+subobj_angle+8) 7� � i=0 � 7 8" x=!(sub+subobj_bounds+12*i+0) 8" y=!(sub+subobj_bounds+12*i+4) 8" z=!(sub+subobj_bounds+12*i+8) 8"" �rotate(x,y,z,a,b,c,x2,y2,z2) 8, � x2<x0 x0=x2 86 � y2<y0 y0=y2 8@ � z2<z0 z0=z2 8J � x2>x1 x1=x2 8T � y2>y1 y1=y2 8^ � z2>z1 z1=z2 8h� 8r� 8|: 8�)� �rotate(x,y,z,a,b,c,� x2,� y2,� z2) 8�a=�(a/ang_scale) 8�b=�(b/ang_scale) 8�c=�(c/ang_scale) 8� 8�x2=x 8�y2=y*�a+z*�a 8�z2=-y*�a+z*�a 8� 8�x=x2*�b-z2*�b 8�y=y2 8�z=x2*�b+z2*�b 8� 9x2=x*�c+y*�c 9y2=-x*�c+y*�c 9z2=z 9&� 90: 9:� �key(k%) 9D � a,surf% 9NO� k%=17 � zoom%<100 zoom%=�min(zoom%+10,100):view_needs_update%=�:�info_bar 9XN� k%=23 � zoom%>10 zoom%=�max(zoom%-10,10):view_needs_update%=�:�info_bar 9bȎ cur_mode% � 9l � 3: 9v �edit_key(k%) 9� � 4: 9� � k%=27 � 9� verts=0 9� view_needs_update%=� 9� � 9�� 9�� 9�: 9�� �edit_key(k%) 9�Ȏ k% � 9� � 19: 9�$ � cur_obj%<>-1 � cur_view%>0 � 9� � selected%=-1 � : � !(�o+obj_list)=0 � : �select_object_raw(-1) : � : + �select_object_raw(!(�o+obj_list)) :* � :4 �set_info_mode(5) :> � :H$ � selected%!subobj_next<>0 � :R2 �select_object_raw(selected%!subobj_next) :\ � :f+ �select_object_raw(!(�o+obj_list)) :p � :z � :� �info_bar :� � :� � 22: :�4 � cur_obj%<>-1 � cur_view%>0 � selected%<>-1 � :�0 � (selected%!subobj_flags � bit_surf)>0 � :�= vertex%=(vertex%+1) � !(selected%!subobj_type+surf_n) :� view_needs_update%=� :� �info_bar :� � :� � :� � 1: :� � �editing_surf � :� � vertex%<>-1 � ;# surf%=selected%!subobj_type ;& a=surf%+surf_coords+12*vertex% ; Ȏ cur_view% � ;$ � 1: ;. a!8+=1000 ;8 � 2: ;B a!4-=1000 ;L � 3: ;V a!0-=1000 ;` � ;j view_needs_update%=� ;t �info_bar ;~ � ;� � ;� � 26: ;� � �editing_surf � ;� � vertex%<>-1 � ;�# surf%=selected%!subobj_type ;�& a=surf%+surf_coords+12*vertex% ;� Ȏ cur_view% � ;� � 1: ;� a!8-=1000 ;� � 2: ;� a!4+=1000 ;� � 3: <