To achieve colored specular Ashadow is not needed :). But credits goes to Andrey - author of Ashadow lib. It's a modified Andrey's sample with his lighting method.
Graphics3D 800,600,32,1
SetBuffer BackBuffer()
fxcam=CreateCamera()
CameraClsColor fxcam,127,127,0
cam=CreateCamera()
CameraClsMode cam,1,1
MoveEntity cam,0,10,-25
CameraClsColor cam,255,255,255
;sky
Sky=CreateSphere(16)
EntityBlend Sky,1
ScaleEntity Sky,100,70,100
FlipMesh Sky
EntityFX Sky,1+8
EntityOrder Sky,1
SkyTex=LoadTexture("data\SkyDome.jpg",1)
EntityTexture Sky,SkyTex
;lightbox
Lbox = LoadLightBox("data\LightCube\normalize","png");
Ref = LoadTexture( "data\lightBl.jpg",1)
TextureBlend ref,1
;DIFFUSE TEXTURE
DiffuseTEX = LoadTexture("data\floor_d.dds", 9)
TextureBlend DiffuseTEX ,2
;SPECULAR TEXTURE
SpecularTex = LoadTexture( "data\floor_s.dds",1)
TextureBlend SpecularTex,2
;NORMALMAP TEXTURE
BumpTEX = LoadTexture("data\floor_n.dds",9)
TextureBlend BumpTEX ,4
;AMBIENT TEXTURE
AmbientTEX=CreateTexture(1,1,1)
TextureBlend AmbientTEX,3
argb= (((5 Shl 8) Or 5) Shl 8) Or 5
WritePixel 0,0,argb ,TextureBuffer(AmbientTEX)
;LIGHTMAP - can be used insted of ambient texture
;lightmap = LoadTexture( "data\lightBl.jpg",1)
;TextureBlend lightmap,2
;LIGHT TEXTURE
LightTEX = CreateTexture( 32,32, 128+256)
SetCubeMode LightTEX,2
TextureBlend LightTEX,1
;REFLECTION TEXTURE
RefTEX = CreateTexture( 32,32, 128+256)
SetCubeMode RefTEX,1
TextureBlend RefTEX,2
;light
light=CreateLight(1)
LightColor light,0,255,0
TurnEntity light,40,90,0
;render lights and reflections
RenderLight ( LightTEX, light, fxcam, cam, Lbox, 3 )
RenderLight ( RefTEX, light, fxcam, cam, Lbox, .1, 1, 15, .9, Ref )
;prepare mesh
pol = LoadMesh("data\cube.3DS")
BlicPol=CopyEntity(pol,pol)
EntityTexture BlicPol, RefTEX, 0, 0
EntityTexture BlicPol, BumpTEX, 0, 1
EntityTexture Blicpol, SpecularTEX, 0, 2
EntityBlend BlicPol, 3
EntityFX BlicPol, 1
EntityTexture pol, LightTEX, 0, 0
EntityTexture pol, BumpTEX, 0, 1
EntityTexture pol, AmbientTEX, 0, 2
;EntityTexture pol, Lightmap, 0, 2
EntityTexture pol, DiffuseTEX, 0, 3
MoveEntity pol,0,-13,0
ScaleEntity pol,30,1,30
;show scene
Const FPS=60
period=1000/FPS
time=MilliSecs()-period
While Not MouseHit(3) Or (KeyHit(1))
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
mouselook cam
KeyControl cam
UpdateWorld
Next
PositionEntity Sky,EntityX( cam,1 ) ,EntityY( cam,1 ), EntityZ( cam,1 )
RenderWorld
Flip False
Wend
End
Function RenderLight ( Reftex, light, fxcam, cam, mesh, Intencity#=1, Mode=0,size#=10, IntencitySpr#=1, Ref=0)
Local BlicSpr
TFormNormal 0,0,1,light,0
CameraViewport fxcam, 0,0,TextureWidth(Reftex), TextureHeight(Reftex)
CameraProjMode fxcam,1
CameraProjMode cam,0
PositionEntity fxcam,65535,65535,65535
ScaleEntity mesh,10,10,10
EntityFX mesh,1
EntityColor mesh,255*IntencitySpr#,255*IntencitySpr#,255*Intencity#
PositionEntity mesh,65535,65535,65535
AlignToVector mesh, TFormedX(), TFormedY(), TFormedZ(),0
ShowEntity mesh
If Mode=1
BlicSpr=CreateSprite()
If Ref EntityTexture BlicSpr,Ref
ScaleSprite BlicSpr,size#,size#
SpriteViewMode BlicSpr,2
EntityBlend BlicSpr,3
EntityColor BlicSpr,255,255,255*IntencitySpr#
EntityFX BlicSpr,17
PositionEntity BlicSpr,65535,65535,65535
MoveEntity BlicSpr, -10*TFormedX(), -10*TFormedY(), -10*TFormedZ()
PointEntity BlicSpr, fxcam
EntityOrder BlicSpr,-1
EndIf
tex_sz=TextureWidth(Reftex)
SetCubeFace Reftex,0
RotateEntity fxcam,0,90,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
SetCubeFace Reftex,1
RotateEntity fxcam,0,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
SetCubeFace Reftex,2
RotateEntity fxcam,0,-90,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
SetCubeFace Reftex,3
RotateEntity fxcam,0,180,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
SetCubeFace Reftex,4
RotateEntity fxcam,-90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
SetCubeFace Reftex,5
RotateEntity fxcam,90,0,0
RenderWorld
CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex)
If Mode=1
FreeEntity BlicSpr
EndIf
HideEntity mesh
CameraProjMode cam,1
CameraProjMode fxcam,0
End Function
Function LoadLightBox( file$, ext$ )
m=CreateMesh()
;front face
b=LoadBrush( file$+"_pz."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,1,1:AddVertex s,+1,+1,-1,0,1
AddVertex s,+1,-1,-1,0,0:AddVertex s,-1,-1,-1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3:
FreeBrush b
;right face
b=LoadBrush( file$+"_nx."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,1,1:AddVertex s,+1,+1,+1,0,1
AddVertex s,+1,-1,+1,0,0:AddVertex s,+1,-1,-1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( file$+"_nz."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,1,1:AddVertex s,-1,+1,+1,0,1
AddVertex s,-1,-1,+1,0,0:AddVertex s,+1,-1,+1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( file$+"_px."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,1,1:AddVertex s,-1,+1,-1,0,1
AddVertex s,-1,-1,-1,0,0:AddVertex s,-1,-1,+1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( file$+"_ny."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,1,1:AddVertex s,+1,+1,+1,0,1
AddVertex s,+1,+1,-1,0,0:AddVertex s,-1,+1,-1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;bottom face
b=LoadBrush( file$+"_py."+ext$,49 )
s=CreateSurface( m,b )
AddVertex s,-1,-1,-1,1,1:AddVertex s,+1,-1,-1,0,1
AddVertex s,+1,-1,+1,0,0:AddVertex s,-1,-1,+1,1,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
FlipMesh m
EntityFX m,1
Return m
End Function
Function mouselook(ent)
mxspd#=MouseXSpeed()*0.25
myspd#=MouseYSpeed()*0.25
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
campitch#=EntityPitch(ent)+myspd#
If campitch#<-85 Then campitch#=-85
If campitch#>85 Then campitch#=85
RotateEntity ent,campitch#,EntityYaw(ent)-mxspd#,EntityRoll(ent)
End Function
Function KeyControl(ent)
If KeyDown(200) MoveEntity ent,0,0,.25
If KeyDown(208) MoveEntity ent,0,0,-.25
If KeyDown(205) MoveEntity ent,.25,0,0
If KeyDown(203) MoveEntity ent,-.25,0,0
If KeyDown(17) MoveEntity ent,0,0,.25
If KeyDown(31) MoveEntity ent,0,0,-.25
If KeyDown(32) MoveEntity ent,.25,0,0
If KeyDown(30) MoveEntity ent,-.25,0,0
If MouseDown(1) MoveEntity ent,0,0,.25
If MouseDown(2) MoveEntity ent,0,0,-.25
End Function