TGC Codebase Backup



Destructable terrain by kevil

16th Dec 2003 12:16
Summary

A destructable terrain.



Description

A pretty complicated system to do destructable terrains. Not really in usable form yet, but I hope I can make it usable in the near future.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    sync on : sync rate 60



rem VAR setup

global worldsizex : worldsizex=20
global worldsizey : worldsizey=20
global worldsizez : worldsizez=20
global xsize# as float : xsize#=25.0
global ysize# as float : ysize#=25.0
global zsize# as float : zsize#=25.0
global Utile# as float : Utile#=1.00
global Vtile# as float : Vtile#=1.00
global Wtile# as float : Wtile#=1.00
global radiusx# as float : radiusx#=5.0
global radiusy# as float : radiusy#=10.0
global radiusz# as float : radiusz#=5.0
global radius2# as float
radius2#=radiusx#*radiusx#
global radparty# as float
radparty#=radiusy#/radiusx#
global radpartz# as float
radpartz#=radiusz#/radiusx#
global poly : poly=0
global smooth# as float : smooth#=0.250
global smoothamount : smoothamount=5
global dim poxeldata(255,12)
global dim conv(8,2)
read_poxeldata()
global dim poxels(worldsizex,worldsizey,worldsizez)
global dim poxeldisplace#(worldsizex,worldsizey,worldsizez,2)
global dim poxelexpl(worldsizex,worldsizey,worldsizez)
global dim poxelpoly(worldsizex,worldsizey,worldsizez)
global dim poxelcolor(worldsizex,worldsizey,worldsizez)






rem fill array
for x=0 to worldsizex
for y=0 to worldsizey
for z=0 to worldsizez
height#=sin(x*9)*sin(z*9)*18.0
dist#=sqrt(((y-5.00)*(y-5.00))+((z-10.00)*(z-10.00)))
dist2#=sqrt(((x-10.00)*(x-10.00))+((z-10.00)*(z-10.00)))
dist3#=sqrt(((x-10.00)*(x-10.00))+((y-10.00)*(y-10.00))+((z-10.00)*(z-10.00)))
if y<height# and dist#>=3 and dist2#>=2 then poxels(x,y,z)=1
rem if x>=1 and x<=3 and y>=1 and y<=3 and z>=1 and z<=3 then poxels(x,y,z)=1
next z
next y
next x



rem load image
load image "grass.bmp",1



write_mesh()
copyarray()

position light 0,0,500,0
position camera 0,500,0

wireframe=0
wkey=0
blow=0

autocam off
make object sphere 5,10.0
scale object 5,100,200,100
ghost object on 5



rem create bullet
make object sphere 6,4.0
color object 6,rgb(255,0,0)
launchtime=timer()
hide object 6





rem MAIN LOOP

do

text 0,0,str$(screen fps())
text 0,20,str$(statistic(1))

yrotate camera wrapvalue(camera angle y()+mousemovex())
xrotate camera wrapvalue(camera angle x()+mousemovey())
if mouseclick()=1 then move camera 2
if mouseclick()=2 then move camera -2


rem collision
gosub poxelcollision



if inkey$()="w" and wkey=0
wkey=1
wireframe=1-wireframe
set object wireframe 10,wireframe
endif

if inkey$()<>"w" then wkey=0



rem rebuild mesh code in steps for speed
if blow=4 then gosub changeit : blow=0
if blow=3 then gosub rebuild2 : blow=4
if blow=2 then gosub rebuild : blow=3
if blow=1 then copyarray() : blow=2





rem launch bullet
if object visible(6)=0 and spacekey()=1 and timer()-launchtime>1000
launchtime=timer()
position object 6,cx#,cy#,cz#
show object 6
rotate object 6,camera angle x(),camera angle y(),0
endif

rem move bullet
col2=0
if object visible(6)=1 then gosub bulletcollision
if timer()-launchtime>2000 then hide object 6

if col2=1 and blow=0
hide object 6
hole(radius#,centerx#,centery#,centerz#)
blow=1
bx=int((centerx#-radius#)/xsize#)-2 : ex=int((centerx#+radius#)/xsize#)+2
by=int((centery#-radius#)/ysize#)-2 : ey=int((centery#+radius#)/ysize#)+2
bz=int((centerz#-radius#)/zsize#)-2 : ez=int((centerz#+radius#)/zsize#)+2
if bx<0 then bx=0
if ex>worldsizex then ex=worldsizex
if by<0 then by=0
if ey>worldsizey then ey=worldsizey
if bz<0 then bz=0
if ez>worldsizez then ez=worldsizez
endif


if returnkey()=1
for x=0 to worldsizex
for y=0 to worldsizey
for z=0 to worldsizez
for n=0 to 2
poxeldisplace#(x,y,z,n)=0
next n
next z
next y
next x
blow=1
bx=0 : ex=20
by=0 : ey=20
bz=0 : ez=20
endif




move camera -150
sync
move camera 150

loop













rem COLLISION

poxelcollision:

cx#=camera position x() : cy#=camera position y() : cz#=camera position z()

minx=int((cx#-radiusx#-xsize#)/xsize#) : maxx=int((cx#+radiusx#+xsize#)/xsize#)
miny=int((cy#-radiusy#-ysize#)/ysize#) : maxy=int((cy#+radiusy#+ysize#)/ysize#)
minz=int((cz#-radiusz#-zsize#)/zsize#) : maxz=int((cz#+radiusz#+zsize#)/zsize#)

col2=0
vecx#=0.00 : vecy#=0.00 : vecz#=0.00

for p=1 to poly
col=0
if polys(p,18)>=minx and polys(p,18)<=maxx and polys(p,19)>=miny and polys(p,19)<=maxy and polys(p,20)>=minz and polys(p,20)<=maxz

v1x#=memblock float(1,12+((p-1)*108)) : v1y#=memblock float(1,16+((p-1)*108)) : v1z#=memblock float(1,20+((p-1)*108))
v2x#=memblock float(1,48+((p-1)*108)) : v2y#=memblock float(1,52+((p-1)*108)) : v2z#=memblock float(1,56+((p-1)*108))
v3x#=memblock float(1,84+((p-1)*108)) : v3y#=memblock float(1,88+((p-1)*108)) : v3z#=memblock float(1,92+((p-1)*108))
rem nx#=polynormal#(p,0) : ny#=polynormal#(p,1) : nz#=polynormal#(p,2)
nx#=((v2y#-v1y#)*(v3z#-v1z#))-((v2z#-v1z#)*(v3y#-v1y#))
ny#=((v2z#-v1z#)*(v3x#-v1x#))-((v2x#-v1x#)*(v3z#-v1z#))
nz#=((v2x#-v1x#)*(v3y#-v1y#))-((v2y#-v1y#)*(v3x#-v1x#))
l#=sqrt((nx#*nx#)+(ny#*ny#)+(nz#*nz#))
nx#=nx#/l# : ny#=ny#/l# : nz#=nz#/l#
D#=((v1x#*nx#)+(v1y#*ny#)+(v1z#*nz#))
u#=((nx#*cx#)+(ny#*cy#)+(nz#*cz#)-D#)/((nx#*nx#*radiusx#)+(ny#*ny#*radiusy#)+(nz#*nz#*radiusz#))

if u#>=0.00 and u#<1.00
   ix#=cx#-(nx#*u#*radiusx#) : iy#=cy#-(ny#*u#*radiusy#) : iz#=cz#-(nz#*u#*radiusz#)
   gosub linecol
   if col=1
      newx#=ix#+(nx#*radiusx#) : newy#=iy#+(ny#*radiusy#) : newz#=iz#+(nz#*radiusz#)
   else
      gosub edgecol
      if col=1
      else
         gosub distcol
         if col=1
         endif
      endif
   endif
endif

if col=1 then col2=1 : vecx#=vecx#+(newx#-cx#) : vecy#=vecy#+(newy#-cy#) : vecz#=vecz#+(newz#-cz#)

endif
next p

position camera curvevalue(cx#+vecx#,camera position x(),2),curvevalue(cy#+vecy#,camera position y(),2),curvevalue(cz#+vecz#,camera position z(),2)
position object 5,curvevalue(cx#+vecx#,object position x(5),2),curvevalue(cy#+vecy#,object position y(5),2),curvevalue(cz#+vecz#,object position z(5),2)

return
















function write_mesh()

poly=0

for x=0 to worldsizex-1
for y=0 to worldsizey-1
for z=0 to worldsizez-1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
poly=poly+(poxeldata(blocktype,0))
next z
next y
next x

global dim polys(poly,20)

poly=0

for x=0 to worldsizex-1
for y=0 to worldsizey-1
for z=0 to worldsizez-1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)

for q=1 to poxeldata(blocktype,0)
poly=poly+1
polys(poly,0)=x+conv(poxeldata(blocktype,1+((q-1)*3)),0)
polys(poly,1)=y+conv(poxeldata(blocktype,1+((q-1)*3)),1)
polys(poly,2)=z+conv(poxeldata(blocktype,1+((q-1)*3)),2)
polys(poly,9)=(((conv(poxeldata(blocktype,1+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00
polys(poly,10)=(((conv(poxeldata(blocktype,1+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00
polys(poly,11)=(((conv(poxeldata(blocktype,1+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00

polys(poly,3)=x+conv(poxeldata(blocktype,2+((q-1)*3)),0)
polys(poly,4)=y+conv(poxeldata(blocktype,2+((q-1)*3)),1)
polys(poly,5)=z+conv(poxeldata(blocktype,2+((q-1)*3)),2)
polys(poly,12)=(((conv(poxeldata(blocktype,2+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00
polys(poly,13)=(((conv(poxeldata(blocktype,2+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00
polys(poly,14)=(((conv(poxeldata(blocktype,2+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00

polys(poly,6)=x+conv(poxeldata(blocktype,3+((q-1)*3)),0)
polys(poly,7)=y+conv(poxeldata(blocktype,3+((q-1)*3)),1)
polys(poly,8)=z+conv(poxeldata(blocktype,3+((q-1)*3)),2)
polys(poly,15)=(((conv(poxeldata(blocktype,3+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00
polys(poly,16)=(((conv(poxeldata(blocktype,3+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00
polys(poly,17)=(((conv(poxeldata(blocktype,3+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00

polys(poly,18)=x : polys(poly,19)=y : polys(poly,20)=z
poxelpoly(polys(poly,0),polys(poly,1),polys(poly,2))=1
poxelpoly(polys(poly,3),polys(poly,4),polys(poly,5))=1
poxelpoly(polys(poly,6),polys(poly,7),polys(poly,8))=1
next q

next z
next y
next x


rem smoothshading

global dim poxelnormal#(worldsizex,worldsizey,worldsizez,2)
global dim polynormal#(poly,2)

for p=1 to poly

v1x#=polys(p,0)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),0) : v1y#=polys(p,1)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),1) : v1z#=polys(p,2)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),2)
v2x#=polys(p,3)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),0) : v2y#=polys(p,4)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),1) : v2z#=polys(p,5)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),2)
v3x#=polys(p,6)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),0) : v3y#=polys(p,7)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),1) : v3z#=polys(p,8)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),2)

nx2#=((v2y#-v1y#)*(v3z#-v1z#))-((v2z#-v1z#)*(v3y#-v1y#))
ny2#=((v2z#-v1z#)*(v3x#-v1x#))-((v2x#-v1x#)*(v3z#-v1z#))
nz2#=((v2x#-v1x#)*(v3y#-v1y#))-((v2y#-v1y#)*(v3x#-v1x#))
l#=sqrt((nx2#*nx2#)+(ny2#*ny2#)+(nz2#*nz2#))
nx2#=nx2#/l# : ny2#=ny2#/l# : nz2#=nz2#/l#

polynormal#(p,0)=nx2# : polynormal#(p,1)=ny2# : polynormal#(p,2)=nz2#

for v=0 to 2
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)+nx2#
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)+ny2#
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)+nz2#
next v

next p



for s=1 to smoothamount

global dim smoothed(worldsizex,worldsizey,worldsizez)

for p=1 to poly
for v=0 to 2
if smoothed(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)))=0
smoothed(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)))=1
x=polys(p,0+(v*3)) : y=polys(p,1+(v*3)) : z=polys(p,2+(v*3))
bx#=(x+poxeldisplace#(x,y,z,0))*xsize# : by#=(y+poxeldisplace#(x,y,z,1))*ysize# : bz#=(z+poxeldisplace#(x,y,z,2))*zsize#
gx#=0.00 : gy#=0.00 : gz#=0.00 : count#=0.00
dim done(27) : cur=0

for q=1 to poly
for w=0 to 2
if polys(q,0+(w*3))=x and polys(q,1+(w*3))=y and polys(q,2+(w*3))=z
for u=0 to 2
if u<>w
x2=polys(q,0+(u*3)) : y2=polys(q,1+(u*3)) : z2=polys(q,2+(u*3)) : ID=(z2*(worldsizex+1)*(worldsizey+1))+(y2*(worldsizex+1))+x2
check=0
for c=0 to cur-1
if done(c)=ID then check=1
next c

if check=0
done(cur)=ID : cur=cur+1
gx#=gx#+((x2+poxeldisplace#(x2,y2,z2,0))*xsize#) : gy#=gy#+((y2+poxeldisplace#(x2,y2,z2,1))*ysize#) : gz#=gz#+((z2+poxeldisplace#(x2,y2,z2,2))*zsize#)
count#=count#+1.00
endif

endif
next u
endif
next w
next q

if count#=0.00
gx#=bx# : gy#=by# : gz#=bz#
else
gx#=gx#/count# : gy#=gy#/count# : gz#=gz#/count#
endif

newx#=bx#+((gx#-bx#)*smooth#) : newy#=by#+((gy#-by#)*smooth#) : newz#=bz#+((gz#-bz#)*smooth#)
poxeldisplace#(x,y,z,0)=(newx#-(x*xsize#))/xsize# : poxeldisplace#(x,y,z,1)=(newy#-(y*ysize#))/ysize# : poxeldisplace#(x,y,z,2)=(newz#-(z*zsize#))/zsize#

if abs(poxeldisplace#(x,y,z,0))>0.50 then poxeldisplace#(x,y,z,0)=poxeldisplace#(x,y,z,0)/(abs(poxeldisplace#(x,y,z,0))/0.500)
if abs(poxeldisplace#(x,y,z,1))>0.50 then poxeldisplace#(x,y,z,1)=poxeldisplace#(x,y,z,1)/(abs(poxeldisplace#(x,y,z,1))/0.500)
if abs(poxeldisplace#(x,y,z,2))>0.50 then poxeldisplace#(x,y,z,2)=poxeldisplace#(x,y,z,2)/(abs(poxeldisplace#(x,y,z,2))/0.500)

undim done(27)
endif
next v
next p

undim smoothed(worldsizex,worldsizey,worldsizez)

next s








make memblock 1,12+(poly*3*36)
write memblock dword 1,0,338
write memblock dword 1,4,36
write memblock dword 1,8,poly*3

for p=1 to poly
for v=0 to 2
pv1=polys(p,0+(v*3)) : pv2=polys(p,1+(v*3)) : pv3=polys(p,2+(v*3))
write memblock float 1,12+(v*36)+((p-1)*108),(pv1+poxeldisplace#(pv1,pv2,pv3,0))*xsize#
write memblock float 1,16+(v*36)+((p-1)*108),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*ysize#
write memblock float 1,20+(v*36)+((p-1)*108),(pv3+poxeldisplace#(pv1,pv2,pv3,2))*zsize#
write memblock float 1,24+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)
write memblock float 1,28+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)
write memblock float 1,32+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)
if abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,0)) and abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,2))
color=rgb((pv2+poxeldisplace#(pv1,pv2,pv3,1))*8,255,(pv2+poxeldisplace#(pv1,pv2,pv3,1))*8) : poxelcolor(pv1,pv2,pv3)=1
else
color=rgb(120+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*6),100+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*5),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*4)
endif
write memblock dword 1,36+(v*36)+((p-1)*108),color
if abs(polynormal#(p,1))>=abs(polynormal#(p,0)) and abs(polynormal#(p,1))>=abs(polynormal#(p,2)) then U#=polys(p,9+(v*3))/1000.0 : V#=polys(p,11+(v*3))/1000.0
if abs(polynormal#(p,2))>=abs(polynormal#(p,0)) and abs(polynormal#(p,2))>abs(polynormal#(p,1)) then U#=polys(p,9+(v*3))/1000.0 : V#=polys(p,10+(v*3))/1000.0
if abs(polynormal#(p,0))>abs(polynormal#(p,1)) and abs(polynormal#(p,0))>abs(polynormal#(p,2)) then U#=polys(p,11+(v*3))/1000.0 : V#=polys(p,10+(v*3))/1000.0
write memblock float 1,40+(v*36)+((p-1)*108),U#
write memblock float 1,44+(v*36)+((p-1)*108),V#
next v
next p

rem undim poxelnormal#(worldsizex,worldsizey,worldsizez,2)

make mesh from memblock 10,1
if object exist(10)=1 then delete object 10
make object 10,10,1


endfunction













rem REBUILD MESH
rebuild:

newpoly=0


for x=bx to ex-1
for y=by to ey-1
for z=bz to ez-1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
newpoly=newpoly+(poxeldata(blocktype,0))
next z
next y
next x

x=bx : y=by : z=bz : q=1
rem find next
lastone=0
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
repeat
if q>poxeldata(blocktype,0) then x=x+1 : q=1
if x=ex then y=y+1 : x=bx
if y=ey then z=z+1 : y=by
if z=ez then lastone=1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
until q<=poxeldata(blocktype,0) or lastone=1



rem ADDITION

addpolys=newpoly
backpoly=poly+1

for p=1 to poly
if polys(p,18)>=bx and polys(p,18)<=ex-1 and polys(p,19)>=by and polys(p,19)<=ey-1 and polys(p,20)>=bz and polys(p,20)<=ez-1
if addpolys<=0

addpolys=addpolys-1
repeat
backpoly=backpoly-1
until polys(backpoly,18)<bx or polys(backpoly,18)>ex-1 or polys(backpoly,19)<by or polys(backpoly,19)>ey-1 or polys(backpoly,20)<bz or polys(backpoly,20)>ez-1
if backpoly>0
copy memblock 101,101,12+((backpoly-1)*108),12+((p-1)*108),108
polynormal#(p,0)=polynormal#(backpoly,0) : polynormal#(p,1)=polynormal#(backpoly,1) : polynormal#(p,2)=polynormal#(backpoly,2)
endif
copypolys(p,0)=-100

else
addpolys=addpolys-1

rem fill in
copypolys(p,0)=x+conv(poxeldata(blocktype,1+((q-1)*3)),0) : copypolys(p,1)=y+conv(poxeldata(blocktype,1+((q-1)*3)),1) : copypolys(p,2)=z+conv(poxeldata(blocktype,1+((q-1)*3)),2) : copypolys(p,9)=(((conv(poxeldata(blocktype,1+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : copypolys(p,10)=(((conv(poxeldata(blocktype,1+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : copypolys(p,11)=(((conv(poxeldata(blocktype,1+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
copypolys(p,3)=x+conv(poxeldata(blocktype,2+((q-1)*3)),0) : copypolys(p,4)=y+conv(poxeldata(blocktype,2+((q-1)*3)),1) : copypolys(p,5)=z+conv(poxeldata(blocktype,2+((q-1)*3)),2) : copypolys(p,12)=(((conv(poxeldata(blocktype,2+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : copypolys(p,13)=(((conv(poxeldata(blocktype,2+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : copypolys(p,14)=(((conv(poxeldata(blocktype,2+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
copypolys(p,6)=x+conv(poxeldata(blocktype,3+((q-1)*3)),0) : copypolys(p,7)=y+conv(poxeldata(blocktype,3+((q-1)*3)),1) : copypolys(p,8)=z+conv(poxeldata(blocktype,3+((q-1)*3)),2) : copypolys(p,15)=(((conv(poxeldata(blocktype,3+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : copypolys(p,16)=(((conv(poxeldata(blocktype,3+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : copypolys(p,17)=(((conv(poxeldata(blocktype,3+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
copypolys(p,18)=x : copypolys(p,19)=y : copypolys(p,20)=z : q=q+1
poxelpoly(copypolys(p,0),copypolys(p,1),copypolys(p,2))=1 : poxelpoly(copypolys(p,3),copypolys(p,4),copypolys(p,5))=1 : poxelpoly(copypolys(p,6),copypolys(p,7),copypolys(p,8))=1
rem get new
if q>poxeldata(blocktype,0)
lastone=0
repeat
if q>poxeldata(blocktype,0) then x=x+1 : q=1
if x=ex then y=y+1 : x=bx
if y=ey then z=z+1 : y=by
if z=ez then lastone=1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
until q<=poxeldata(blocktype,0) or lastone=1
endif

rem normals
v1x#=copypolys(p,0)+poxeldisplace#(copypolys(p,0),copypolys(p,1),copypolys(p,2),0) : v1y#=copypolys(p,1)+poxeldisplace#(copypolys(p,0),copypolys(p,1),copypolys(p,2),1) : v1z#=copypolys(p,2)+poxeldisplace#(copypolys(p,0),copypolys(p,1),copypolys(p,2),2)
v2x#=copypolys(p,3)+poxeldisplace#(copypolys(p,3),copypolys(p,4),copypolys(p,5),0) : v2y#=copypolys(p,4)+poxeldisplace#(copypolys(p,3),copypolys(p,4),copypolys(p,5),1) : v2z#=copypolys(p,5)+poxeldisplace#(copypolys(p,3),copypolys(p,4),copypolys(p,5),2)
v3x#=copypolys(p,6)+poxeldisplace#(copypolys(p,6),copypolys(p,7),copypolys(p,8),0) : v3y#=copypolys(p,7)+poxeldisplace#(copypolys(p,6),copypolys(p,7),copypolys(p,8),1) : v3z#=copypolys(p,8)+poxeldisplace#(copypolys(p,6),copypolys(p,7),copypolys(p,8),2)

nx2#=((v2y#-v1y#)*(v3z#-v1z#))-((v2z#-v1z#)*(v3y#-v1y#))
ny2#=((v2z#-v1z#)*(v3x#-v1x#))-((v2x#-v1x#)*(v3z#-v1z#))
nz2#=((v2x#-v1x#)*(v3y#-v1y#))-((v2y#-v1y#)*(v3x#-v1x#))
l#=sqrt((nx2#*nx2#)+(ny2#*ny2#)+(nz2#*nz2#))
nx2#=nx2#/l# : ny2#=ny2#/l# : nz2#=nz2#/l#
polynormal#(p,0)=nx2# : polynormal#(p,1)=ny2# : polynormal#(p,2)=nz2#

explcolor=0
if poxelexpl(copypolys(p,0),copypolys(p,1),copypolys(p,2))=1 and poxelexpl(copypolys(p,3),copypolys(p,4),copypolys(p,5))=1 and poxelexpl(copypolys(p,6),copypolys(p,7),copypolys(p,8))=1 then explcolor=1

for v=0 to 2
pv1=copypolys(p,0+(v*3)) : pv2=copypolys(p,1+(v*3)) : pv3=copypolys(p,2+(v*3))
write memblock float 101,12+(v*36)+((p-1)*108),(pv1+poxeldisplace#(pv1,pv2,pv3,0))*xsize#
write memblock float 101,16+(v*36)+((p-1)*108),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*ysize#
write memblock float 101,20+(v*36)+((p-1)*108),(pv3+poxeldisplace#(pv1,pv2,pv3,2))*zsize#
write memblock float 101,24+(v*36)+((p-1)*108),poxelnormal#(copypolys(p,0+(v*3)),copypolys(p,1+(v*3)),copypolys(p,2+(v*3)),0)
write memblock float 101,28+(v*36)+((p-1)*108),poxelnormal#(copypolys(p,0+(v*3)),copypolys(p,1+(v*3)),copypolys(p,2+(v*3)),1)
write memblock float 101,32+(v*36)+((p-1)*108),poxelnormal#(copypolys(p,0+(v*3)),copypolys(p,1+(v*3)),copypolys(p,2+(v*3)),2)
if abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,0)) and abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,2))
color=rgb((pv2+poxeldisplace#(pv1,pv2,pv3,1))*8,255,(pv2+poxeldisplace#(pv1,pv2,pv3,1))*8)
else
color=rgb(120+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*6),100+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*5),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*4)
endif
if poxelexpl(pv1,pv2,pv3)=1 or poxelcolor(pv1,pv2,pv3)=0 then color=rgb(120+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*6),100+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*5),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*4)
write memblock dword 101,36+(v*36)+((p-1)*108),color
if abs(polynormal#(p,1))>=abs(polynormal#(p,0)) and abs(polynormal#(p,1))>=abs(polynormal#(p,2)) then U#=copypolys(p,9+(v*3))/1000.0 : V#=copypolys(p,11+(v*3))/1000.0
if abs(polynormal#(p,2))>=abs(polynormal#(p,0)) and abs(polynormal#(p,2))>abs(polynormal#(p,1)) then U#=copypolys(p,9+(v*3))/1000.0 : V#=copypolys(p,10+(v*3))/1000.0
if abs(polynormal#(p,0))>abs(polynormal#(p,1)) and abs(polynormal#(p,0))>abs(polynormal#(p,2)) then U#=copypolys(p,11+(v*3))/1000.0 : V#=copypolys(p,10+(v*3))/1000.0
write memblock float 101,40+(v*36)+((p-1)*108),U#
write memblock float 101,44+(v*36)+((p-1)*108),V#
next v

endif
endif
next p

return












rem REBUILD MESH

rebuild2:


rem CREATION/REMOVAL


newp=poly+addpolys
dim polys(newp,20)
delete memblock 1
make memblock 1,12+(newp*108)

if addpolys<=0
copy memblock 101,1,0,0,12+(newp*108)
write memblock dword 1,8,newp*3
backpoly=poly+1
for p=1 to newp
if copypolys(p,0)=-100
repeat
backpoly=backpoly-1
until copypolys(backpoly,0)<>-100
for n=0 to 20
polys(p,n)=copypolys(backpoly,n)
next n
else
for n=0 to 20
polys(p,n)=copypolys(p,n)
next n
endif
next p

else
copy memblock 101,1,0,0,12+(poly*108)
write memblock dword 1,8,newp*3
for p=1 to poly
for n=0 to 20
polys(p,n)=copypolys(p,n)
next n
next p

for p=poly+1 to newp

polys(p,0)=x+conv(poxeldata(blocktype,1+((q-1)*3)),0) : polys(p,1)=y+conv(poxeldata(blocktype,1+((q-1)*3)),1) : polys(p,2)=z+conv(poxeldata(blocktype,1+((q-1)*3)),2) : polys(p,9)=(((conv(poxeldata(blocktype,1+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : polys(p,10)=(((conv(poxeldata(blocktype,1+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : polys(p,11)=(((conv(poxeldata(blocktype,1+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
polys(p,3)=x+conv(poxeldata(blocktype,2+((q-1)*3)),0) : polys(p,4)=y+conv(poxeldata(blocktype,2+((q-1)*3)),1) : polys(p,5)=z+conv(poxeldata(blocktype,2+((q-1)*3)),2) : polys(p,12)=(((conv(poxeldata(blocktype,2+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : polys(p,13)=(((conv(poxeldata(blocktype,2+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : polys(p,14)=(((conv(poxeldata(blocktype,2+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
polys(p,6)=x+conv(poxeldata(blocktype,3+((q-1)*3)),0) : polys(p,7)=y+conv(poxeldata(blocktype,3+((q-1)*3)),1) : polys(p,8)=z+conv(poxeldata(blocktype,3+((q-1)*3)),2) : polys(p,15)=(((conv(poxeldata(blocktype,3+((q-1)*3)),0)-0.00)/Utile#)+((x-0.00)/Utile#)-int((x-0.00)/Utile#))*1000.00 : polys(p,16)=(((conv(poxeldata(blocktype,3+((q-1)*3)),1)-0.00)/Vtile#)+((y-0.00)/Vtile#)-int((y-0.00)/Vtile#))*1000.00 : polys(p,17)=(((conv(poxeldata(blocktype,3+((q-1)*3)),2)-0.00)/Wtile#)+((z-0.00)/Wtile#)-int((z-0.00)/Wtile#))*1000.00
polys(p,18)=x : polys(p,19)=y : polys(p,20)=z : q=q+1
poxelpoly(polys(p,0),polys(p,1),polys(p,2))=1 : poxelpoly(polys(p,3),polys(p,4),polys(p,5))=1 : poxelpoly(polys(p,6),polys(p,7),polys(p,8))=1
rem get new
if q>poxeldata(blocktype,0)
lastone=0
repeat
if q>poxeldata(blocktype,0) then x=x+1 : q=1
if x=ex then y=y+1 : x=bx
if y=ey then z=z+1 : y=by
if z=ez then lastone=1
blocktype=(poxels(x,y,z)*1)+(poxels(x+1,y,z)*2)+(poxels(x,y+1,z)*4)+(poxels(x+1,y+1,z)*8)+(poxels(x,y,z+1)*16)+(poxels(x+1,y,z+1)*32)+(poxels(x,y+1,z+1)*64)+(poxels(x+1,y+1,z+1)*128)
until q<=poxeldata(blocktype,0) or lastone=1
endif

v1x#=polys(p,0)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),0) : v1y#=polys(p,1)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),1) : v1z#=polys(p,2)+poxeldisplace#(polys(p,0),polys(p,1),polys(p,2),2)
v2x#=polys(p,3)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),0) : v2y#=polys(p,4)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),1) : v2z#=polys(p,5)+poxeldisplace#(polys(p,3),polys(p,4),polys(p,5),2)
v3x#=polys(p,6)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),0) : v3y#=polys(p,7)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),1) : v3z#=polys(p,8)+poxeldisplace#(polys(p,6),polys(p,7),polys(p,8),2)
nx2#=((v2y#-v1y#)*(v3z#-v1z#))-((v2z#-v1z#)*(v3y#-v1y#))
ny2#=((v2z#-v1z#)*(v3x#-v1x#))-((v2x#-v1x#)*(v3z#-v1z#))
nz2#=((v2x#-v1x#)*(v3y#-v1y#))-((v2y#-v1y#)*(v3x#-v1x#))
l#=sqrt((nx2#*nx2#)+(ny2#*ny2#)+(nz2#*nz2#))
nx2#=nx2#/l# : ny2#=ny2#/l# : nz2#=nz2#/l#
polynormal#(p,0)=nx2# : polynormal#(p,1)=ny2# : polynormal#(p,2)=nz2#

explcolor=0
if poxelexpl(polys(p,0),polys(p,1),polys(p,2))=1 and poxelexpl(polys(p,3),polys(p,4),polys(p,5))=1 and poxelexpl(polys(p,6),polys(p,7),polys(p,8))=1 then explcolor=1

for v=0 to 2
pv1=polys(p,0+(v*3)) : pv2=polys(p,1+(v*3)) : pv3=polys(p,2+(v*3))
write memblock float 1,12+(v*36)+((p-1)*108),(pv1+poxeldisplace#(pv1,pv2,pv3,0))*xsize#
write memblock float 1,16+(v*36)+((p-1)*108),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*ysize#
write memblock float 1,20+(v*36)+((p-1)*108),(pv3+poxeldisplace#(pv1,pv2,pv3,2))*zsize#
write memblock float 1,24+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)
write memblock float 1,28+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)
write memblock float 1,32+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)
if abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,0)) and abs(poxelnormal#(pv1,pv2,pv3,1))>abs(poxelnormal#(pv1,pv2,pv3,2))
color=rgb((pv2+poxeldisplace#(pv1,pv2,pv3,1))*8,255,(pv2+poxeldisplace#(pv1,pv2,pv3,1))*8)
else
color=rgb(120+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*6),100+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*5),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*4)
endif
if poxelexpl(pv1,pv2,pv3)=1 or poxelcolor(pv1,pv2,pv3)=0 then color=rgb(120+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*6),100+((pv2+poxeldisplace#(pv1,pv2,pv3,1))*5),(pv2+poxeldisplace#(pv1,pv2,pv3,1))*4)
write memblock dword 1,36+(v*36)+((p-1)*108),color
if abs(polynormal#(p,1))>=abs(polynormal#(p,0)) and abs(polynormal#(p,1))>=abs(polynormal#(p,2)) then U#=polys(p,9+(v*3))/1000.0 : V#=polys(p,11+(v*3))/1000.0
if abs(polynormal#(p,2))>=abs(polynormal#(p,0)) and abs(polynormal#(p,2))>abs(polynormal#(p,1)) then U#=polys(p,9+(v*3))/1000.0 : V#=polys(p,10+(v*3))/1000.0
if abs(polynormal#(p,0))>abs(polynormal#(p,1)) and abs(polynormal#(p,0))>abs(polynormal#(p,2)) then U#=polys(p,11+(v*3))/1000.0 : V#=polys(p,10+(v*3))/1000.0
write memblock float 1,40+(v*36)+((p-1)*108),U#
write memblock float 1,44+(v*36)+((p-1)*108),V#
next v

next p

endif

poly=newp

global dim poxelnormal#(worldsizex,worldsizey,worldsizez,2)

for p=1 to poly
nx2#=polynormal#(p,0) : ny2#=polynormal#(p,1) : nz2#=polynormal#(p,2)
for v=0 to 2
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)+nx2#
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)+ny2#
poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)=poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)+nz2#
next v
next p

for p=1 to poly
for v=0 to 2
write memblock float 1,24+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),0)
write memblock float 1,28+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),1)
write memblock float 1,32+(v*36)+((p-1)*108),poxelnormal#(polys(p,0+(v*3)),polys(p,1+(v*3)),polys(p,2+(v*3)),2)
next v
next p


return









rem CHANGE IT

changeit:
make mesh from memblock 10,1
if object exist(10)=1 then delete object 10
make object 10,10,1
return










function hole(radius#,centerx#,centery#,centerz#)

bigsize#=xsize#
if ysize#>bigsize# then bigsize#=ysize#
if zsize#>bigsize# then bigsize#=zsize#
rad#=radius#*radius# : rad2#=(radius#-bigsize#)*(radius#-bigsize#) : rad3#=(radius#+bigsize#)*(radius#+bigsize#)

for x=int((centerx#-radius#)/xsize#)-1 to int((centerx#+radius#)/xsize#)+2
for y=int((centery#-radius#)/ysize#)-1 to int((centery#+radius#)/ysize#)+2
for z=int((centerz#-radius#)/zsize#)-1 to int((centerz#+radius#)/zsize#)+2
changed=0
if x>=0 and x<=worldsizex and y>=0 and y<=worldsizey and z>=0 and z<=worldsizez
x#=x*xsize# : y#=y*ysize# : z#=z*zsize#
rem x2#=x#+poxeldisplace#(x,y,z,0) : y2#=y#+poxeldisplace#(x,y,z,1) : z2#=z#+poxeldisplace#(x,y,z,2)
dist#=((x#-centerx#)*(x#-centerx#))+((y#-centery#)*(y#-centery#))+((z#-centerz#)*(z#-centerz#))
part1#=rad#/dist#
if part1#>1.00 and poxels(x,y,z)=1 then poxels(x,y,z)=0 : changed=1
if dist#=0 then poxels(x,y,z)=0

if dist#>rad2# and dist#<rad3#
part#=radius#/sqrt(dist#)
newx#=centerx#+((x#-centerx#)*part#) : newy#=centery#+((y#-centery#)*part#) : newz#=centerz#+((z#-centerz#)*part#)
if abs(newx#-x#)<=0.50*xsize# and abs(newy#-y#)<=0.50*ysize# and abs(newz#-z#)<=0.50*zsize#
if newx#-x#=-0.50*xsize# or newy#-y#=-0.50*ysize# or newz#-z#=-0.50*zsize# then poxels(x,y,z)=0
if poxelpoly(x,y,z)=0 then poxeldisplace#(x,y,z,0)=(newx#-x#)/xsize# : poxeldisplace#(x,y,z,1)=(newy#-y#)/ysize# : poxeldisplace#(x,y,z,2)=(newz#-z#)/zsize#
if poxelpoly(x,y,z)=1 then poxeldisplace#(x,y,z,0)=0.50*(poxeldisplace#(x,y,z,0)+((newx#-x#)/xsize#)) : poxeldisplace#(x,y,z,1)=0.50*(poxeldisplace#(x,y,z,1)+((newy#-y#)/ysize#)) : poxeldisplace#(x,y,z,2)=0.50*(poxeldisplace#(x,y,z,2)+((newz#-z#)/zsize#))
poxelexpl(x,y,z)=1
if changed=1 then poxels(x,y,z)=1
if poxelpoly(x,y,z)=0 then poxelnormal#(x,y,z,0)=centerx#-newx# : poxelnormal#(x,y,z,1)=centery#-newy# : poxelnormal#(x,y,z,2)=centerz#-newz#
if poxelpoly(x,y,z)=1 then poxelnormal#(x,y,z,0)=0.50*(((centerx#-newx#)/radius#)+poxelnormal#(x,y,z,0)) : poxelnormal#(x,y,z,1)=0.50*(((centery#-newy#)/radius#)+poxelnormal#(x,y,z,1)) : poxelnormal#(x,y,z,2)=0.50*(((centerz#-newz#)/radius#)+poxelnormal#(x,y,z,2))
endif
endif

endif
next z
next y
next x

rem second check
for x=int((centerx#-radius#)/xsize#)-1 to int((centerx#+radius#)/xsize#)+1
for y=int((centery#-radius#)/ysize#)-1 to int((centery#+radius#)/ysize#)+1
for z=int((centerz#-radius#)/zsize#)-1 to int((centerz#+radius#)/zsize#)+1
if poxelexpl(x,y,z)=1
for p=0 to 1
for q=0 to 1
for r=0 to 1
x2=x+p : y2=y+q : z2=z+r
if poxels(x2-1,y2-1,z2-1)+poxels(x2,y2-1,z2-1)+poxels(x2-1,y2,z2-1)+poxels(x2,y2,z2-1)+poxels(x2-1,y2-1,z2)+poxels(x2,y2-1,z2)+poxels(x2-1,y2,z2)+poxels(x2,y2,z2)>=3
p2=(p*2)-1 : q2=(q*2)-1 : r2=(r*2)-1
if poxels(x+p2,y,z)=0 and poxels(x,y+q2,z)=0 and poxels(x,y,z+r2)=0 then poxels(x,y,z)=0 : r=1 : q=1 : p=1
endif
next r
next q
next p
endif
if poxels(x+1,y,z)+poxels(x-1,y,z)+poxels(x,y+1,z)+poxels(x,y-1,z)+poxels(x,y,z+1)+poxels(x,y,z-1)<3 then poxels(x,y,z)=0
next z
next y
next x

endfunction












function copyarray()
global dim copypolys(poly,20)
for p=1 to poly
for n=0 to 20
copypolys(p,n)=polys(p,n)
next n
next p
if memblock exist(101)=1 then delete memblock 101
rem make memblock from mesh 101,10
make memblock 101,get memblock size(1) : copy memblock 1,101,0,0,get memblock size(1)
endfunction












rem Poly Collision
linecol:

col=0
count=0

if abs(nz#)>=abs(nx#) and abs(nz#)>=abs(ny#)
if iy#>v1y# and iy#<v2y# or iy#<v1y# and iy#>v2y#
if (((iy#-v1y#)/(v2y#-v1y#))*(v2x#-v1x#))+v1x#<ix# then count=count+1
endif
if iy#>v3y# and iy#<v2y# or iy#<v3y# and iy#>v2y#
if (((iy#-v3y#)/(v2y#-v3y#))*(v2x#-v3x#))+v3x#<ix# then count=count+1
endif
if iy#>v1y# and iy#<v3y# or iy#<v1y# and iy#>v3y#
if (((iy#-v1y#)/(v3y#-v1y#))*(v3x#-v1x#))+v1x#<ix# then count=count+1
endif
endif

if abs(ny#)>=abs(nx#) and abs(ny#)>abs(nz#)
if iz#>v1z# and iz#<v2z# or iz#<v1z# and iz#>v2z#
if (((iz#-v1z#)/(v2z#-v1z#))*(v2x#-v1x#))+v1x#<ix# then count=count+1
endif
if iz#>v3z# and iz#<v2z# or iz#<v3z# and iz#>v2z#
if (((iz#-v3z#)/(v2z#-v3z#))*(v2x#-v3x#))+v3x#<ix# then count=count+1
endif
if iz#>v1z# and iz#<v3z# or iz#<v1z# and iz#>v3z#
if (((iz#-v1z#)/(v3z#-v1z#))*(v3x#-v1x#))+v1x#<ix# then count=count+1
endif
endif

if abs(nx#)>abs(ny#) and abs(nx#)>abs(nz#)
if iy#>v1y# and iy#<v2y# or iy#<v1y# and iy#>v2y#
if (((iy#-v1y#)/(v2y#-v1y#))*(v2z#-v1z#))+v1z#<iz# then count=count+1
endif
if iy#>v3y# and iy#<v2y# or iy#<v3y# and iy#>v2y#
if (((iy#-v3y#)/(v2y#-v3y#))*(v2z#-v3z#))+v3z#<iz# then count=count+1
endif
if iy#>v1y# and iy#<v3y# or iy#<v1y# and iy#>v3y#
if (((iy#-v1y#)/(v3y#-v1y#))*(v3z#-v1z#))+v1z#<iz# then count=count+1
endif
endif

count#=count
if count#/2.0<>int(count#/2.0) then col=1

return







rem Vertex Collision
distcol:


distv1#=((cx#-v1x#)*(cx#-v1x#))+((cy#-v1y#)*(cy#-v1y#)/(radparty#*radparty#))+((cz#-v1z#)*(cz#-v1z#)/(radpartz#*radpartz#))
if distv1#<radius2#
col=1
part#=radiusx#/sqrt(distv1#)
newx#=v1x#+((cx#-v1x#)*part#) : newy#=v1y#+((cy#-v1y#)*part#) : newz#=v1z#+((cz#-v1z#)*part#)
return
endif
distv2#=((cx#-v2x#)*(cx#-v2x#))+((cy#-v2y#)*(cy#-v2y#)/(radparty#*radparty#))+((cz#-v2z#)*(cz#-v2z#)/(radpartz#*radpartz#))
if distv2#<radius2#
col=1
part#=radiusx#/sqrt(distv2#)
newx#=v2x#+((cx#-v2x#)*part#) : newy#=v2y#+((cy#-v2y#)*part#) : newz#=v2z#+((cz#-v2z#)*part#)
return
endif
distv3#=((cx#-v3x#)*(cx#-v3x#))+((cy#-v3y#)*(cy#-v3y#)/(radparty#*radparty#))+((cz#-v3z#)*(cz#-v3z#)/(radpartz#*radpartz#))
if distv3#<radius2#
col=1
part#=radiusx#/sqrt(distv3#)
newx#=v3x#+((cx#-v3x#)*part#) : newy#=v3y#+((cy#-v3y#)*part#) : newz#=v3z#+((cz#-v3z#)*part#)
return
endif

return








rem Edge Collision
edgecol:

u1#=(((cx#-v1x#)*(v2x#-v1x#))+((cy#-v1y#)*(v2y#-v1y#)/(radparty#*radparty#))+((cz#-v1z#)*(v2z#-v1z#)/(radpartz#*radpartz#)))/(((v2x#-v1x#)*(v2x#-v1x#))+((v2y#-v1y#)*(v2y#-v1y#)/(radparty#*radparty#))+((v2z#-v1z#)*(v2z#-v1z#)/(radpartz#*radpartz#)))
uq1#=(((cx#-v1x#)*(v2x#-v1x#))+((cy#-v1y#)*(v2y#-v1y#))+((cz#-v1z#)*(v2z#-v1z#)))/(((v2x#-v1x#)*(v2x#-v1x#))+((v2y#-v1y#)*(v2y#-v1y#))+((v2z#-v1z#)*(v2z#-v1z#)))

if u1#>=0.00 and u1#<=1.00
p1x#=v1x#+(u1#*(v2x#-v1x#)) : p1y#=v1y#+(u1#*(v2y#-v1y#)) : p1z#=v1z#+(u1#*(v2z#-v1z#))
pq1x#=v1x#+(uq1#*(v2x#-v1x#)) : pq1y#=v1y#+(uq1#*(v2y#-v1y#)) : pq1z#=v1z#+(uq1#*(v2z#-v1z#))
distl1#=((cx#-p1x#)*(cx#-p1x#))+((cy#-p1y#)*(cy#-p1y#)/(radparty#*radparty#))+((cz#-p1z#)*(cz#-p1z#)/(radpartz#*radpartz#))
if distl1#<radius2#
part#=radiusx#/sqrt(distl1#)
newx#=pq1x#+((cx#-pq1x#)*part#) : newy#=pq1y#+((cy#-pq1y#)*part#) : newz#=pq1z#+((cz#-pq1z#)*part#)
col=1
return
endif
endif

u2#=(((cx#-v1x#)*(v3x#-v1x#))+((cy#-v1y#)*(v3y#-v1y#)/(radparty#*radparty#))+((cz#-v1z#)*(v3z#-v1z#)/(radpartz#*radpartz#)))/(((v3x#-v1x#)*(v3x#-v1x#))+((v3y#-v1y#)*(v3y#-v1y#)/(radparty#*radparty#))+((v3z#-v1z#)*(v3z#-v1z#)/(radpartz#*radpartz#)))
uq2#=(((cx#-v1x#)*(v3x#-v1x#))+((cy#-v1y#)*(v3y#-v1y#))+((cz#-v1z#)*(v3z#-v1z#)))/(((v3x#-v1x#)*(v3x#-v1x#))+((v3y#-v1y#)*(v3y#-v1y#))+((v3z#-v1z#)*(v3z#-v1z#)))

if u2#>=0.00 and u2#<=1.00
p1x#=v1x#+(u2#*(v3x#-v1x#)) : p1y#=v1y#+(u2#*(v3y#-v1y#)) : p1z#=v1z#+(u2#*(v3z#-v1z#))
pq1x#=v1x#+(uq2#*(v3x#-v1x#)) : pq1y#=v1y#+(uq2#*(v3y#-v1y#)) : pq1z#=v1z#+(uq2#*(v3z#-v1z#))
distl1#=((cx#-p1x#)*(cx#-p1x#))+((cy#-p1y#)*(cy#-p1y#)/(radparty#*radparty#))+((cz#-p1z#)*(cz#-p1z#)/(radpartz#*radpartz#))
if distl1#<radius2#
part#=radiusx#/sqrt(distl1#)
newx#=pq1x#+((cx#-pq1x#)*part#) : newy#=pq1y#+((cy#-pq1y#)*part#) : newz#=pq1z#+((cz#-pq1z#)*part#)
col=1
return
endif
endif

u3#=(((cx#-v2x#)*(v3x#-v2x#))+((cy#-v2y#)*(v3y#-v2y#)/(radparty#*radparty#))+((cz#-v2z#)*(v3z#-v2z#)/(radpartz#*radpartz#)))/(((v3x#-v2x#)*(v3x#-v2x#))+((v3y#-v2y#)*(v3y#-v2y#)/(radparty#*radparty#))+((v3z#-v2z#)*(v3z#-v2z#)/(radpartz#*radpartz#)))
uq3#=(((cx#-v2x#)*(v3x#-v2x#))+((cy#-v2y#)*(v3y#-v2y#))+((cz#-v2z#)*(v3z#-v2z#)))/(((v3x#-v2x#)*(v3x#-v2x#))+((v3y#-v2y#)*(v3y#-v2y#))+((v3z#-v2z#)*(v3z#-v2z#)))

if u3#>=0.00 and u3#<=1.00
p1x#=v2x#+(u3#*(v3x#-v2x#)) : p1y#=v2y#+(u3#*(v3y#-v2y#)) : p1z#=v2z#+(u3#*(v3z#-v2z#))
pq1x#=v2x#+(uq3#*(v3x#-v2x#)) : pq1y#=v2y#+(uq3#*(v3y#-v2y#)) : pq1z#=v2z#+(uq3#*(v3z#-v2z#))
distl1#=((cx#-p1x#)*(cx#-p1x#))+((cy#-p1y#)*(cy#-p1y#)/(radparty#*radparty#))+((cz#-p1z#)*(cz#-p1z#)/(radpartz#*radpartz#))
if distl1#<radius2#
part#=radiusx#/sqrt(distl1#)
newx#=pq1x#+((cx#-pq1x#)*part#) : newy#=pq1y#+((cy#-pq1y#)*part#) : newz#=pq1z#+((cz#-pq1z#)*part#)
col=1
return
endif
endif


return










rem bullet collision
bulletcollision:

bx#=object position x(6) : by#=object position y(6) : bz#=object position z(6)
move object 6,10
ex#=object position x(6) : ey#=object position y(6) : ez#=object position z(6)

minx=int((bx#-20.0-xsize#)/xsize#) : maxx=int((bx#+20.0+xsize#)/xsize#)
miny=int((by#-20.0-ysize#)/ysize#) : maxy=int((by#+20.0+ysize#)/ysize#)
minz=int((bz#-20.0-zsize#)/zsize#) : maxz=int((bz#+20.0+zsize#)/zsize#)

col2=0

for p=1 to poly
col=0
if polys(p,18)>=minx and polys(p,18)<=maxx and polys(p,19)>=miny and polys(p,19)<=maxy and polys(p,20)>=minz and polys(p,20)<=maxz

v1x#=memblock float(1,12+((p-1)*108)) : v1y#=memblock float(1,16+((p-1)*108)) : v1z#=memblock float(1,20+((p-1)*108))
v2x#=memblock float(1,48+((p-1)*108)) : v2y#=memblock float(1,52+((p-1)*108)) : v2z#=memblock float(1,56+((p-1)*108))
v3x#=memblock float(1,84+((p-1)*108)) : v3y#=memblock float(1,88+((p-1)*108)) : v3z#=memblock float(1,92+((p-1)*108))
rem nx#=polynormal#(p,0) : ny#=polynormal#(p,1) : nz#=polynormal#(p,2)
nx#=((v2y#-v1y#)*(v3z#-v1z#))-((v2z#-v1z#)*(v3y#-v1y#))
ny#=((v2z#-v1z#)*(v3x#-v1x#))-((v2x#-v1x#)*(v3z#-v1z#))
nz#=((v2x#-v1x#)*(v3y#-v1y#))-((v2y#-v1y#)*(v3x#-v1x#))
l#=sqrt((nx#*nx#)+(ny#*ny#)+(nz#*nz#))
nx#=nx#/l# : ny#=ny#/l# : nz#=nz#/l#
D#=((v1x#*nx#)+(v1y#*ny#)+(v1z#*nz#))
u#=((nx#*bx#)+(ny#*by#)+(nz#*bz#)-D#)/((nx#*(bx#-ex#))+(ny#*(by#-ey#))+(nz#*(bz#-ez#)))

if u#>=-1.00 and u#<=1.00
   ix#=bx#+((ex#-bx#)*u#) : iy#=by#+((ey#-by#)*u#) : iz#=bz#+((ez#-bz#)*u#)
   gosub linecol
   if col=1
      centerx#=ix# : centery#=iy# : centerz#=iz# : radius#=80.0
   endif
endif

if col=1 then col2=1 : exit

endif
next p

return











function read_poxeldata()

open to read 1,"poxels.dat"

for poxel=0 to 255

read string 1,a$
poxeldata(poxel,0)=val(left$(a$,1))

for q=1 to poxeldata(poxel,0)
for v=0 to 2
place=2+v+((q-1)*3)
poxeldata(poxel,place-1)=val(mid$(a$,place))
next v
next q

next poxel


for q=1 to 8
q$=bin$(q-1)
conv(q,0)=val(mid$(q$,len(q$)))
conv(q,1)=val(mid$(q$,len(q$)-1))
conv(q,2)=val(mid$(q$,len(q$)-2))
next q

endfunction