Speaking of AShadow...

Blitz3D Forums/Blitz3D Userlibs/Speaking of AShadow...

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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