Code archives/3D Graphics - Effects/Realtime Vertex lights
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Just a vertex light demo, can be expanded. Puki came up with this idea, and may have a better system. But since his code was not made available I took a quick whack at it. Nothing amazing for sure, and limited applications. You would have to plan your area with this system in mind to make any real use of it. And try to either limit light range or number of lights ect. Ill expand on this when I have time. | |||||
Graphics3D 640,480,32,2 ;Wireframe True camera=CreateCamera() PositionEntity camera,-15,40,-50 ;create some random junk For i=1 To 2 sc=Rand(1,10) Cube=CreateSphere(12) ScaleMesh cube,sc,sc,sc:EntityPickMode cube,2,True createfakelight_Receiver(cube) PositionEntity cube,Rand(-20,20),Rand(-20,20),Rand(-20,20) Next For i=-5 To 5 For ii=-5 To 5 land=createsquare(2) ScaleMesh land,10,1,10 PositionEntity land,i*10,-3,ii*10 createfakelight_Receiver(land) Next Next globallight=createfakelight(100,500,100,38,38,38,500) light1=createfakelight(10,5,10,0,0,255,53.5) light2=createfakelight(10,5,10,255,0,0,53.5) lightvisual=CreateCube() lightvisual2=CreateCube() ; put a visual cube on the lights EntityParent lightvisual,light1,False EntityParent lightvisual2,light2,False TranslateEntity light1,0,10,20 TranslateEntity light2,0,10,-20 PointEntity camera,cube ; update it all While Not KeyDown(1) MoveEntity light1,0,0,2 TurnEntity light1,0,1.5,0 MoveEntity light2,0,0,-.25 TurnEntity light2,0,-.5,0 lightfakereceivers() UpdateWorld() RenderWorld Flip Wend End Type FakeLight Field Ent Field r,g,b Field range# Field active End Type Type FakeLightReceiver Field ent ;just the entity handle End Type Function CreateFakeLight(x#,y#,z#,r#,g#,b#,range#) fl.fakelight=New fakelight fl\ent=CreatePivot() PositionEntity fl\ent,x,y,z fl\r=r fl\g=g fl\b=b fl\range=range fl\active=1 Return fl\ent End Function Function FakeLightOnOFF(toggle=0) For fl.fakelight=Each fakelight If fl\ent=ent Then fl\active=toggle Exit EndIf Next End Function Function SetFakeLightRange(ent,newrange#) For fl.fakelight=Each fakelight If fl\ent=ent Then fl\range=newrange# Exit EndIf Next End Function Function SetFakeLightRGB(ent,newr,newg,newb) For fl.fakelight=Each fakelight If fl\ent=ent Then fl\r=newr fl\g=newg fl\b=newb Exit EndIf Next End Function Function CreateFakeLight_Receiver(ent,fx=3) flr.fakelightreceiver=New fakelightreceiver flr\ent=ent EntityFX ent,fx End Function Function LightFakeReceivers() For flr.FakeLightReceiver=Each FakeLightReceiver LightMesh flr\ent,-255,-255,-255 For fl.fakelight=Each fakelight If fl\active=1 And EntityDistance(flr\ent,fl\ent)=<(fl\range*4) Then If EntityVisible (fl\ent,flr\ent) Then TFormPoint 0,0,0,fl\ent,flr\ent LightMesh flr\ent,fl\r,fl\g,fl\b,fl\range*.25,TFormedX(),TFormedY(),TFormedZ() EndIf EndIf Next Next End Function Function createsquare(segs#=2,parent=0) mesh=CreateMesh( parent ) surf=CreateSurface( mesh ) l# =-.5 b# = -.5 tvc= 0 Repeat u# = l + .5 v# = b + .5 AddVertex surf,l,0,b,u,1-v tvc=tvc + 1 l = l + 1/segs If l > .501 Then l = -.5 b = b + 1/segs End If Until b > .5 vc# =0 Repeat AddTriangle (surf,vc,vc+segs+1,vc+segs+2) AddTriangle (surf,vc,vc+segs+2,vc+1) vc = vc + 1 tst# = ((vc+1) /(segs+1)) -Floor ((vc+1) /(segs+1)) If (vc > 0) And (tst=0) Then vc = vc + 1 End If Until vc=>tvc-segs-2 UpdateNormals mesh Return mesh End Function |
Comments
| ||
Not bad - for a beginner. :) |
Code Archives Forum