multiple lights for dot3?

Blitz3D Forums/Blitz3D Programming/multiple lights for dot3?

Raitsun(Posted 2005) [#1]
The last weeks i was dealing with dot3 code. I've seen Fredborgs demo and a demo of a guy who's name i forgot. It demonstrates Bumpmapping on a floor plane with three lights... i think the ones who saw it, too, know what i mean... I just didn't know how to get halos code, it seems to be lost or something.

well... All the demos i've seen had some important features left out, some of them didn't allow more than one dot3-light, some didn't regard the lights direction, some didn't regard the normalmapped mesh's direction and some ignored the lights range in their caclulations.

Yesterday i coded an own method from scratch... I tried to regard most of the features.
It works pretty well in most situations. Only thing is i didn't get multiple lights to add to each other. It's always the last light only, that's regarded.

Here's the code:

Global redd#, greend#, blued#

Global bumpvec = CreatePivot()

Type bumpmesh
	Field mesh		;bumpmapped mesh's handle
End Type

Type d3light
	Field light		;dot3 light's handle
	Field rng#		;dot3 light's range
End Type

Function graphics_Dot3_Normalupdate()
For bm.bumpmesh = Each bumpmesh
	
	redd = 0
	greend= 0
	blued =0
		
	For n = 1 To CountSurfaces(bm\mesh)
		
		surf = GetSurface(bm\mesh,n)
		
		For v = 0 To CountVertices(surf)-1

			For d.d3light= Each d3light
	
				TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),bm\mesh,0
				
				x# = TFormedX() - EntityX(d\light)
				y# = TFormedY() - EntityY(d\light)
				z# = TFormedZ() - EntityZ(d\light)
			
				TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),bm\mesh,0
		
				dist# = Sqr(x*x+y*y+z*z)
				Intens# = 1.0 - (dist/(d\rng*8))
				If intens < 0 Then intens = 0
			
				PositionEntity bumpvec,TFormedX(),TFormedY(),TFormedZ(),1
				AlignToVector bumpvec,TFormedX(),TFormedY(),TFormedZ(),3,1
				RotateEntity bumpvec,EntityPitch(bumpvec,1),EntityYaw(bumpvec,1),0,1
			
				TFormNormal x,y,z,0,bumpvec
			
				redd = redd+(1.0-TFormedX())*127
				greend = greend+(1.0-TFormedY())*127
				blued = blued+((1.0-TFormedZ())*127)*Intens					
	
			Next
			
		Next
		
		VertexColor surf,v,redd,greend,blued
		
	Next

Next

End Function


Raitsun


DH(Posted 2005) [#2]
How about a complete demo to show how well it works?


Raitsun(Posted 2005) [#3]
That's how i got it right now.... but i need help with using multiple lights...

Graphics3D 1024, 768, 32, 1
SetBuffer BackBuffer()

Global bumpvec = CreatePivot()
Global redd#, greend#, blued#

AmbientLight 0,0,0

a# = 1.0

;------------ Initialise dot3-types ----------------------
Type bumpmesh
	Field mesh		;bumpmapped mesh's handle
End Type

Type d3light
	Field light		;dot3 light's handle
	Field rng#		;dot3 light's range
End Type
;------------------------------------------------------------

;---------- Setting up the light ----------------------
pivot = CreatePivot()
light = graphics_Dot3_CreateBumpLight(10, pivot)
;lightx = CreateSphere(8, light)
;EntityFX lightx, 1
;ScaleEntity lightx, 0.1, 0.1, 0.1
;EntityColor lightx, 255,255,255
MoveEntity light, 0, 0, -6
;------ creating the mesh and apply normal map ---------------------
mesh = CreateCube()
ScaleEntity mesh, 2, 2, 2
graphics_dot3_applybumpmesh(mesh, "boden_diffuse.jpg", "boden.jpg")
UpdateNormals mesh
;--------- create a camera --------------------------------
camera = CreateCamera()
PositionEntity camera,0,0,-9.0
CameraRange camera,0.1,110
CameraClsColor camera,0,0,0

;--------- Main loop -----------------------------------------
While Not KeyHit(1)
	
	;FPS
	tt=MilliSecs()
    fps#=1000/(tt-ttold)
    ttold=tt
	
	
	;turn the mesh with cursor-keys
	If KeyDown(200) TurnEntity mesh, 70/fps,0,0
	
	If KeyDown(208) TurnEntity mesh,-70/fps,0,0	
	
	If KeyDown(205) TurnEntity mesh,0,-70/fps,0
	
	If KeyDown(203) TurnEntity mesh,0, 70/fps,0

	
	;move the light while space is pressed
	If KeyDown(57) Then
		a = a + 1
		If a = 360.0 Then a = 0
		PositionEntity light,Cos(a)*5,Sin(a)*5,-9	
	EndIf

	;Updates
	graphics_dot3_Normalupdate()
	UpdateWorld()
	RenderWorld()

    Text 10,10,"FPS: "+Int(fps#)
	
	Flip

Wend


;---------------- Functions -------------------------------------
Function graphics_Dot3_CreateBumpLight(range#, parent)	;create a light regarded by the dot3-system

	d.d3light = New d3light
	
	d\light = CreatePivot(parent)
	d\rng = range
	
	Return d\light
	
End Function

Function graphics_Dot3_ApplyBumpMesh(mesh, diffuse$, bump$)		;apply a mesh to be a normal mapped mesh (diffusemap = colormap without shades)

	bm.bumpmesh = New bumpmesh
	
	difftex = LoadTexture(diffuse, 1+256)
	bumptex = LoadTexture(bump, 1+256)
	
	bm\mesh = mesh
	
	TextureBlend bumptex, 4
	
	EntityTexture mesh, bumptex, 0, 0
	EntityTexture mesh, difftex, 0, 1
	
	EntityFX mesh, 3
	
End Function


Function graphics_dot3_Normalupdate()
For bm.bumpmesh = Each bumpmesh
	

	For d.d3light= Each d3light
	
	For n = 1 To CountSurfaces(bm\mesh)
		surf = GetSurface(bm\mesh,n)
		For v = 0 To CountVertices(surf)-1
			TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),bm\mesh,0
			x# = TFormedX() - EntityX(d\light)
			y# = TFormedY() - EntityY(d\light)
			z# = TFormedZ() - EntityZ(d\light)
			
			TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),bm\mesh,0
			
			dist# = Sqr(x*x+y*y+z*z)
			Intens# = 1.0 - (dist/(d\rng*8))
			If intens < 0 Then intens = 0
			
			PositionEntity bumpvec,TFormedX(),TFormedY(),TFormedZ(),1
			AlignToVector bumpvec,TFormedX(),TFormedY(),TFormedZ(),3,1
			RotateEntity bumpvec,EntityPitch(bumpvec,1),EntityYaw(bumpvec,1),0,1
			
			TFormNormal x,y,z,0,bumpvec
				
			redd = (1.0-TFormedX())*127
			greend = (1.0-TFormedY())*127
			blued = ((1.0-TFormedZ())*127)*Intens
				
			VertexColor surf,v,redd,greend,blued		
		Next
	Next
  Next
Next
End Function


You'll need this pics:

boden.jpg:


boden_diffuse.jpg:


(b.t.w.: boden is the german word for floor)

Raitsun
(These Pictures are from Ben Cloward Homepage:
http://www.monitorstudios.com/bcloward/index.html)


Naughty Alien(Posted 2005) [#4]
I modify before Fredborgs demo and I run around with 20 different lights at same time..and working well..