I fixed it so the shadow stretches with distance. The shadow also fades out, which is a nice way to go from not casting a shadow to casting one:
Graphics3D 800,600,16,2 SetBuffer BackBuffer() l=CreateLight() Global cam=CreateCamera() MoveEntity cam,0,20,-80 m=LoadMesh("C:\Program Files\Blitz3D\Samples\Blitz 3D Samples\mak\castle\markio\mariorun.x") PositionMesh m,0,-MeshHeight(m)/2,0 PositionEntity m,0,MeshHeight(m)/2,0 EntityColor m,100,100,100 b=CreateCube() ScaleMesh b,100,.5,100 PositionEntity b,0,-1,0 t=LoadTexture("C:\Program Files\Blitz3D\Samples\Blitz 3D Samples\mak\castle\castle\gothic3.jpg") ScaleTexture t,0.1,0.1 EntityTexture b,t ;================================================ ;Shadow caster type ;================================================ Type ShadowCaster Field camera Field w,h Field texture Field shadowmesh Field magnification# Field shadowsize# End Type ;================================================ ;Create a shadow caster entity ;================================================ s.shadowcaster=New shadowcaster s\camera=CreateCamera() HideEntity s\camera s\w=256 s\h=256 s\texture=CreateTexture(s\w,s\h) s\shadowmesh=createquad() s\magnification#=12 s\shadowsize#=10 EntityFX s\shadowmesh,9 EntityBlend s\shadowmesh,2 EntityTexture s\shadowmesh,s\texture CameraClsColor s\camera,255,255,255 CameraViewport s\camera,0,0,s\w,s\h CameraFogMode s\camera,1 CameraFogRange s\camera,0,0 PositionEntity s\camera,0,30,0 ;================================================ ;Loop ;================================================ While Not KeyHit(1) MoveEntity m,KeyDown(205)-KeyDown(203),0,KeyDown(200)-KeyDown(208) HideEntity b UpdateShadowCaster s,m ShowEntity b PointEntity cam,m RenderWorld CopyRect 0,0,s\w,s\h,0,0,TextureBuffer(s\texture),BackBuffer() Flip Wend End ;================================================ ;Update shadows caster entity ;================================================ Function UpdateShadowCaster(s.shadowcaster,rec) ShowEntity rec HideEntity s\shadowmesh HideEntity cam ShowEntity s\camera PointEntity s\camera,rec EntityColor rec,0,0,0 zoom#=EntityDistance(s\camera,rec)/s\magnification CameraZoom s\camera,zoom CameraClsMode s\camera,1,1 fog=EntityDistance(s\camera,rec)*2+50 CameraFogColor s\camera,fog,fog,fog RenderWorld EntityColor rec,255,255,255 HideEntity s\camera ShowEntity cam CopyRect 0,0,s\w,s\h,0,0,BackBuffer(),TextureBuffer(s\texture) ShowEntity s\shadowmesh surf=GetSurface(s\shadowmesh,1) nx#=EntityX(rec,1)-EntityX(s\camera,1) ny#=EntityY(rec,1)-EntityY(s\camera,1) nz#=EntityZ(rec,1)-EntityZ(s\camera,1) PositionEntity s\shadowmesh,EntityX(rec,1),0,EntityZ(rec,1) RotateEntity s\shadowmesh,0,0,0 AlignToVector s\shadowmesh,nx,0,nz,3 AlignToVector s\shadowmesh,0,1,0,2 CameraProject s\camera,EntityX(rec,1),0,EntityZ(rec,1) y=ProjectedY() stretch#=PointDistance(EntityX(rec,1),0,EntityZ(rec,1),EntityX(s\camera,1),0,EntityZ(s\camera,1)) stretch=stretch/5.0 ScaleEntity s\shadowmesh,s\shadowsize,1,s\shadowsize+stretch MoveEntity s\shadowmesh,0,0,(Float(y)/Float(s\h)-.5)*s\shadowsize*2+stretch End Function Function CreateQuad() mesh=CreateMesh() surf=CreateSurface(mesh) AddVertex surf,-1,0,-1,0,1 AddVertex surf,-1,0,1,0,0 AddVertex surf,1,0,1,1,0 AddVertex surf,1,0,-1,1,1 AddTriangle surf,0,1,2 AddTriangle surf,2,3,0 Return mesh End Function