Here is the result of a little experiment with point lights and DBc.
Looks a bit like a lava lamp
set display mode 1024,768,16:sync on:hide mouse:autocam off
backdrop on:color backdrop 0:color light 0,0:set ambient light 2
dim b#(3):dim bd#(300,3):dim lp#(7,3):dim ld#(7,3)
for n=1 to 300
make object sphere n,5:fade object n,200
position object n,rnd(100)-50,rnd(100)-50,rnd(100)-50
for m=1 to 3:bd#(n,m)=rnd(2000)-1000:bd#(n,m)=bd#(n,m)/10000:next m
next n
data 255,0,0,0,255,0,0,0,255,255,0,255,0,255,255,255,255,0,255,255,255
for n=1 to 7:read r:read g:read b
make light n:color light n,r,g,b:set point light n,0,0,0
position light n,0,0,0:set light range n,40
make object sphere 1000+n,1:color object 1000+n,rgb(r,g,b)
set object 1000+n,1,0,0,0,0
next n
for n=1 to 7:for i=1 to 3
ld#(n,i)=rnd(500)+500:ld#(n,i)=ld#(n,i)/1000
if rnd(1000)>500 then ld#(n,i)=0-ld#(n,i)
next i:next n
do
for n=1 to 300:set object to camera orientation n
b#(1)=object position x(n):b#(2)=object position y(n):b#(3)=object position z(n)
for m=1 to 3:if abs(b#(m)+bd#(n,m))>50
r#=rnd(500)+500:bd#(n,m)=sgn(0-bd#(n,m))
bd#(n,m)=bd#(n,m)*r#:bd#(n,m)=bd#(n,m)/10000
endif
next m:position object n,b#(1)+bd#(n,1),b#(2)+bd#(n,2),b#(3)+bd#(n,3)
next n
for n=1 to 7:for i=1 to 3
h#=lp#(n,i)+ld#(n,i):if abs(h#)>50
r#=rnd(500)+500:ld#(n,i)=(0-sgn(ld#(n,i)))*r#:ld#(n,i)=ld#(n,i)/1000
endif:lp#(n,i)=lp#(n,i)+ld#(n,i)
next i
position light n,lp#(n,1),lp#(n,2),lp#(n,3)
position object 1000+n,lp#(n,1),lp#(n,2),lp#(n,3)
next n
a#=wrapvalue(a#+0.1):x#=100*sin(a#):z#=100*cos(a#)
position camera x#,0,z#:point camera 0,0,0
sync
loop
function sgn(x#)
f=1:if x#<0 then f=0-1
endfunction f
The last word in this sentence is wrong