memory who has not written the program but this is the version modified from me ;)
no remember
Include "fps.bb"
Graphics3D 640,480,16,2
;AmbientLight 0,0,0
Global DS=4
Const NObj=4
Dim sphereobj( NObj, NObj, NObj)
NObj2=NObj+1
Global FactPercent#=100.0/(NObj2*NObj2*NObj2)
Global val#=0
Global Light=CreateSphere(4)
Lightp=CreateLight(2,Light)
;Global Cube = LoadMesh("cubo128.3ds")
;ScaleEntity Cube,20,20,20
val=0
For x=1 To NObj
For y= 1 To NObj
For z= 1 To NObj
sphereobj(x,y,z)=CreateSphere(32)
EntityPickMode sphereobj(x,y,z),2
PositionEntity sphereobj(x,y,z),x*DS,y*DS,z*DS
val=val+FactPercent
Print "Create Object :"+val
Next
Next
Next
For x=1 To NObj
For y= 1 To NObj
For z= 1 To NObj
LightObject(sphereobj(x,y,z), Light)
Next
Next
Next
camera=CreateCamera()
PositionEntity camera,12,12,2
RotateEntity camera,0,0,315
Global vrot#=.5
Global vmove#=.2
Global OldTime=timer
Global mla#=.2, mlb#=0
While Not KeyHit(1)
If KeyDown(63) Then Stop
If (Not KeyDown(29)) And (Not KeyDown(157)) Then ; CTRL
If KeyDown(208) Then TurnEntity camera,vrot,0,0
If KeyDown(200) Then TurnEntity camera,-vrot,0,0
If KeyDown(203) Then TurnEntity camera,0,vrot,0
If KeyDown(205) Then TurnEntity camera,0,-vrot,0
Else
If KeyDown(208) Then MoveEntity camera,0,0,-vmove
If KeyDown(200) Then MoveEntity camera,0,0, vmove
EndIf
mlb=EntityX(Light)
If mlb>30 Then mla=-mla
If mlb<0 Then mla=mla
;PositionEntity Light,mlb,mlb,mlb
MoveEntity Light,mla,mla,mla
PositionEntity Light, EntityX(sphereobj(1,1,1)), EntityY(sphereobj(1,1,1)), EntityZ(sphereobj(1,1,1))
;LightObject(Cube, Light)
val=0
; For x=1 To NObj
; For y= 1 To NObj
; For z= 1 To NObj
; LightObject(sphereobj(x,y,z), Light)
; Next
; Next
; Next
UpdateWorld
RenderWorld
DrawFps()
Text 5,15 ,TrisRendered()+" "+EntityX(Light)
Flip
Wend
End
Function LightObject(entity, Light)
ApplyAmbient(entity,32,32,32)
ApplyLight(entity, EntityX(Light), EntityY(Light), EntityZ(Light), 20, 1,255,255,255)
EntityFX entity,3
End Function
Function ApplyAmbient(entity,r,g,b)
count=CountSurfaces(entity)
For n=1 To count
surf=GetSurface(entity,n)
Vcount=CountVertices(surf)-1
For v=0 To Vcount
VertexColor surf,v,r,g,b
Next
Next
End Function
Function ApplyLight(entity,LX#,LY#,LZ#,radius#,flag,Lr,Lg,Lb)
;Lambert shading in blitz "by Staton Richardson (Arbitrage)"
;This function is meant for 1 time lighting not realtime
;entity is the entity you wish to light
;LX, LY, LZ are the coodinates of the light in world space
;Lr, Lg, Lb are the colors of the light
;radius is the radius the light affects. Light falls off with distance so half the radius would be half the light
;flag tells the function to include the current vertex color for multiple lights
Local AttSHW#=0.8
Local kx#,ky#,kz#
kx = EntityX(entity)-LX#
ky = EntityY(entity)-LY#
kz = EntityZ(entity)-LZ#
Lrr# = (Lr/radius)
Lrg# = (Lg/radius)
Lrb# = (Lb/radius)
count=CountSurfaces(entity)
For n=1 To count
surf=GetSurface(entity,n)
Vcount=CountVertices(surf)-1
For v=0 To Vcount
xd#=VertexX(surf,v)+kx
yd#=VertexY(surf,v)+ky
zd#=VertexZ(surf,v)+kz
mag#=Sqr(xd#*xd# + yd#*yd# + zd#*zd#)
If flag=1
vcr=VertexRed(surf,v)
vcg=VertexGreen(surf,v)
vcb=VertexBlue(surf,v)
EndIf
vr=Lr-Lrr*mag#
vg=Lg-Lrg*mag#
vb=Lb-Lrb*mag#
If vr>255 Then vr=255
If vg>255 Then vg=255
If vb>255 Then vb=255
vx#=VertexNX(surf,v)
vy#=VertexNY(surf,v)
vz#=VertexNZ(surf,v)
mag#=1/mag#
; LnX#=xd#*mag#*-1
; LnY#=yd#*mag#*-1
; LnZ#=zd#*mag#*-1
LnX#=-(xd#*mag#)
LnY#=-(yd#*mag#)
LnZ#=-(zd#*mag#)
Kh#=((vx)*LnX+(vy)*LnY+(vz)*LnZ)
DLx = (LX-xd)
DLy = (LY-yd)
DLz = (LZ-zd)
;Stop
a = LinePick (xd,yd,zd,DLx,DLy,DLz)
If kh#>0 And a=0
VertexColor surf,v, vr*Kh#+vcr, vg*Kh#+vcg, vb*Kh#+vcb
Else
;VertexColor surf,v, vcr*AttSHW, vcg*AttSHW, vcb*AttSHW
VertexColor surf,v, 0, 0, 0
EndIf
Next
Next
End Function