Quote: "
Hmm, I wonder if doing distance checks for each object and using INTERSECT OBJECT only for nearby objects would be efficient at all.
"
Actually, for simple enviroments I've been using such method a lot:
example:
_______TOP_______:
rem Generic Template
rem Player = object 10
rem Cubes = objects 100-120
_____INITIALIZE_____:
set display mode 1920,1080,32
SYNC ON
SYNC RATE 60
backdrop on
color backdrop rgb(10,100,100)
autocam off
set global collision off
global objnum
x#=1000.0:z#=1000.0:a#=0.0:s#=0.0:h#=0.0
cx#=0.0:cy#=0.0:cz#=0.0:ca#=0.0:camght=50
camrot=0:camdist=0:camlen=0:pdist#=0
collx#=0:collz#=0:objnum=100
gosub Setupland1
gosub makeplayer
gosub makeobjects
gosub ambient
gosub resetcam
_____DO_LOOP_____:
do
if x#<100 then x#=100
if z#<100 then z#=100
if x#>landsize-100 then x#=landsize-100
if z#>landsize-100 then z#=landsize-100
collx#=x#:collz#=z#
if inkey$()="e" then sync rate 0
if inkey$()="E" then sync rate 60
gosub printdata
gosub camera_controls
gosub update_camera
gosub Playercontrol
gosub checkdistance
gosub checkcoll
SYNC
loop
rem -------------ROUTINES--------------------
____SET_SCENERY___:
Setupland1:
rem ground textures
rem create texture
cls rgb(0,100,20)
inkcolor#=rgb(255,255,255)
line 0,0,0,250
line 1,1,1,250
line 2,2,2,250
line 0,0,250,0
line 1,1,250,1
line 2,2,250,2
line 0,0,250,250
line 0,250,250,0
rem next n
get image 2,0,0,250,250
rem Make landscape
landsize=4000:grid=30:mtxrandomize=1
make matrix 1,landsize,landsize,grid,grid
set matrix 1,1,0,0,1,1,1,1
prepare matrix texture 1,2,1,1
randomize matrix 1,mtxrandomize
rem ***********
rem get ground done
update matrix 1
return
_____CONTROL_PLAYER___:
Playercontrol:
rem ---- Control Character ----
x#=newxvalue(x#,a#,s#)
z#=newzvalue(z#,a#,s#)
h#=get ground height(1,x#,z#)
position object 10,x#,h#,z#
yrotate object 10,a#
if upkey()=1 and s#<8 then s#=s#+0.1
if downkey()=1 and s#>-8 then s#=s#-0.2
if leftkey()=1 then a#=wrapvalue(a#-1)
if rightkey()=1 then a#=wrapvalue(a#+1)
if inkey$()="ù" then s#=0.0
if inkey$()="à" then s#=10.0
return
______CAMERA_ROUTINES____:
rem -------CAMERA--------
camera_controls:
if inkey$()="z" then camdist=camdist+0.2
if inkey$()="Z" then camdist=camdist-0.2
if inkey$()="x" then camhgt=camhgt+2
if inkey$()="X" then camhgt=camhgt-2
if inkey$()="c" then camrot=wrapvalue(camrot+0.2)
if inkey$()="C" then camrot=wrapvalue(camrot-0.2)
if inkey$()="v" then camlen=camlen+0.2
if inkey$()="V" then camlen=camlen-0.2
if inkey$()="b" then camrot = 180
if inkey$()="B" then camrot = 0
if inkey$()="n" then camdist=50:camlen=0:camrot=180:camhgt=80:camflag=0:set camera range 20,20000:wait 1
if inkey$()="N" then camdist=80:camlen=0:camrot=0:camhgt=80:camflag=1:set camera range 20,20000:wait 1
if inkey$()=">" then gosub Resetcam
if inkey$()="m" then camdist=-1000:camhgt=500:camrot=0:set camera range 100,20000
if inkey$()="M" then camdist=-3000:camhgt=1000:camrot=0:set camera range 100,20000
return
rem camera update
update_camera:
rem Position camera to the back of the character
ca#=wrapvalue(a#+camrot)
cx#=newxvalue(x#,ca#,camdist)
cz#=newzvalue(z#,ca#,camdist)
cy#=h#
position camera cx#,cy#+camhgt,cz#
rem Point camera at object
point camera x#,h#+camhgt+camlen,z#
return
rem camera reset
Resetcam:
set camera range 1,20000
camdist=-150
camhgt=60
camrot=0
camlen=0
return
_____PRINT_ON__SCREEN___:
printdata:
set cursor 0,0
print "Polys=",statistic(1)
print "FPS=",screen fps()
print "player x#= ",x#
print "player h#= ",h#
print "player z#= ",z#
print "player angle a#= ",a#
print "speed s#= ",s#
print "close object distance pdist#=",pdist#
print "hit object objnum=",objnum
print "intersect value collcheck#=",collcheck#
return
printdata2:
set cursor 0,0
print statistic(1)
print screen fps()
return
_____CHECK_ROUTINES_____:
checkdistance:
for n=100 to 120
xdif#=object position x(n)-x#
zdif#=object position z(n)-z#
pdist#=sqrt(xdif#*xdif#+zdif#*zdif#)
if pdist#<cubesize+50 then objnum=n:return
next n
objnum=0
collcheck#=0
return
checkcoll:
if inkey$()="r" then return
if s#>0
tox#=newxvalue(x#,a#,200)
toz#=newzvalue(z#,a#,200)
if objnum>0
collcheck#=intersect object(objnum,x#,10,z#,tox#,10,toz#)
endif
if collcheck#<20 and collcheck#>0 then x#=collx#:z#=collz#:s#=0
endif
if s#<0
tox#=newxvalue(x#,a#,-200)
toz#=newzvalue(z#,a#,-200)
if objnum>0
collcheck#=intersect object(objnum,x#,10,z#,tox#,10,toz#)
endif
if collcheck#<20 and collcheck#>0 then x#=collx#:z#=collz#:s#=0
endif
return
____MAKE_OBJECTS____:
rem -------------Characters-Objects------------
makeplayer:
make object cone 10,30
scale object 10,100,200,100
xrotate object 10,90
fix object pivot 10
return
makeobjects:
randomize 1
cubesize=100
for n=100 to 120
make object cube n,cubesize
set object n,1,1,1,1,1,1
color object n,rgb(rnd(150),rnd(150),rnd(150))
xpos=rnd(landsize):zpos=rnd(landsize)
position object n,xpos,cubesize/2,zpos
next n
return
rem ------------------ambient----------------
_______AMBIENT_______:
ambient:
set ambient light 70
set directional light 0,0.1,0.2,0.25
position light 0,0.0,2000.0,0.0
point light 0,4000,0,4000
fog on
fog color rgb(150,150,200)
fog distance 10000
return
end
My max has been collision check to 3-4000 trees and 100-150 objects with good results with a recent PC. (i7 8G ram).
I remember you could hit severe bottlenecks with older PCs