Code archives/3D Graphics - Effects/Textured Spotlight
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| A nice little effect, that could be used for car headlights or flashlights. It shouldn't be too dificult to understand how it works... It's not optimized, so you probably need to change some stuff if you want to use it in a game... You will need this image: ![]() Have fun! | |||||
;
;
; Textured spotlight thingy
;
; Created by Mikkel Fredborg
; Use as you please!
;
Type dl_receiver
Field mesh
End Type
Type dl_light
Field entity
Field range#
Field scale#
Field intensity#
Field flicker#
Field flickerrange#
Field r#,g#,b#
End Type
Global dl_brush
Global dl_tex
Function DL_Init()
ClearTextureFilters
dl_tex = LoadTexture("spotlight2.png",1+16+32)
dl_brush = CreateBrush()
BrushBlend dl_brush,3
BrushFX dl_brush,1+2
BrushTexture dl_brush,dl_tex
End Function
Function DL_Free()
For dlr.dl_receiver = Each dl_receiver
FreeEntity dlr\mesh
Delete dlr
Next
For dll.dl_light = Each dl_light
Delete dll
Next
If dl_tex Then FreeTexture dl_tex
If dl_brush Then FreeBrush dl_brush
dl_tex = 0
dl_brush = 0
End Function
Function DL_SetReceiver(mesh)
dlr.dl_receiver = New dl_receiver
dlr\mesh = CopyMesh(mesh)
PaintMesh dlr\mesh,dl_brush
End Function
Function DL_SetLight(entity,range#=500.0,scale#=0.75,intensity#=2.0,flicker#=0.05,flickerrange#=0.5,r#=200,g#=220,b#=255)
dll.dl_light = First dl_light
If dll = Null
dll.dl_light = New dl_light
End If
dll\entity = entity
dll\range = range
dll\scale = scale
dll\intensity = intensity
dll\flicker = flicker
dll\flickerrange = flickerrange
dll\r = r
dll\g = g
dll\b = b
End Function
Function DL_Update()
dll.dl_light = First dl_light
If dll = Null Then Return
If Rnd(0.0,1.0)<dll\flicker
intensity# = dll\intensity*Rnd(dll\flickerrange,1.0)
Else
intensity# = dll\intensity
End If
For dlr.dl_receiver = Each dl_receiver
mesh = dlr\mesh
n_surfs = CountSurfaces(mesh)
For s = 1 To n_surfs
surf = GetSurface(mesh,s)
n_verts = CountVertices(surf)-1
For v = 0 To n_verts
TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),mesh,dll\entity
x# = TFormedX()
y# = TFormedY()
z# = TFormedZ()
dist# = Sqr(x*x + y*y + z*z)*dll\scale
tu# = (x/dist)+0.5
tv# = 1.0-((y/dist)+0.5)
VertexTexCoords surf,v,tu,tv
If z>dll\range Then z = dll\range
falloff# = 1.0-(z/dll\range)
If falloff<0.0 Then falloff = 0.0
If falloff>1.0 Then falloff = 1.0
TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),mesh,dll\entity
dot# = -TFormedZ()*falloff*intensity
If dot>0.0
VertexColor surf,v,dot*dll\r,dot*dll\g,dot*dll\b
Else
VertexColor surf,v,0,0,0
End If
Next
Next
Next
End Function
;
; Example
;
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
HidePointer
AmbientLight 12,24,50
SeedRnd MilliSecs()
light = CreateLight()
RotateEntity light,70,40,0
LightColor light,50,50,50
camera = CreateCamera()
scene = CreateMesh()
For i = 0 To 100
cube = CreateCube()
ScaleMesh cube,Rnd(1,10),Rnd(1,10),Rnd(1,10)
RotateMesh cube,Rnd(-90,90),Rnd(-180,180),Rnd(-180,180)
PositionMesh cube,Rnd(-100,100),Rnd(-100,100),Rnd(-100,100)
AddMesh cube,scene
FreeEntity cube
Next
cube = CreateCube()
ScaleMesh cube,150,150,150
FlipMesh cube
AddMesh cube,scene
FreeEntity cube
DL_Init()
DL_SetReceiver(scene)
DL_SetLight(camera)
spd# = 2.0
Repeat
MoveEntity camera,(KeyDown(205)-KeyDown(203))*spd,0,(KeyDown(200)-KeyDown(208))*spd
TurnEntity camera,-MouseYSpeed()*0.25,-MouseXSpeed()*0.25,0
RotateEntity camera,EntityPitch(camera,True),EntityYaw(camera,True),0
MoveMouse 320,240
DL_Update()
RenderWorld
Flip
Until KeyHit(1)
DL_Free()
End |
Comments
| ||
| Thank's Fredborg!!! :) This is exactly the type of effect I was searching for my torch for my player character of my game im' designing!!! This should be of great use to me! Thank's again!!! ;) |
| ||
| wicked effect :D thx alot |
| ||
| I like it. Thanks. |
| ||
| Nice Effect. Thanks!!!!! |
| ||
| This is very nice, but how can you apply that projected texture inside an already textured mesh? I have tried that and it only disrupted the other textures. Is there a way to separate different coordinates for each texture (as in, 1 set for a diffuse map and another one for this light texture)? EDIT: Yes there is... TextureCoords(). |
Code Archives Forum
