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:
<