Lightmapping

Blitz3D Forums/Blitz3D Programming/Lightmapping

sniper_boy147(Posted 2009) [#1]
What I wanted to do is have a fully textured character darken when he is in the dark part of a lightmap. There was a way to do this, but I forgot... :( Could any of you please help enlighten me? (links to tutorials and codes would be helpful...)


Warner(Posted 2009) [#2]
I could find a thread about this, but the links are all dead:
http://www.blitzbasic.com/Community/posts.php?topic=55245
Also this ones:
http://www.blitzbasic.com/Community/posts.php?topic=39805
http://www.blitzbasic.com/Community/posts.php?topic=32856


sniper_boy147(Posted 2009) [#3]
Thanks for the post, wish all the links would work... :(


Naughty Alien(Posted 2009) [#4]
here it is working code..so, all you need is to after your lightmaped level is loaded, call function >Lightmap_Array(lightmap)< before main loop, and in main loop do just this >ShadeEntity(entity,ambient=90)< and you are set..I hope this helps..

Dim LightmapArray(0,0)
Global LMArray_width#
Global LMArray_height#

Function shadeentity(entity,ambient=90)
If LinePick(EntityX(Entity), EntityY(Entity)+10, EntityZ(Entity), 0, -125, 0, 0)
	If PickedUVW()
        Local ARGB# = GetTexColor(PickedU(), PickedV())
	    Local RD# = (ARGB Shr 16) And $ff + ambient
        Local GD# = (ARGB Shr 8) And $ff + ambient
        Local BD# = (ARGB And $ff) + ambient
		If RD# > 255 Then RD = 255
		If GD# > 255 Then GD = 255
		If BD# > 255 Then BD = 255
		EntityColor(Entity, RD, GD, BD)
EndIf
EndIf

End Function 

Function GetTexColor(u#,v#)
	u#=u#*(LMArray_width#-1)
	v#=v#*(LMArray_height#-1)
	Return lightmaparray(u,v)
End Function

Type PickedTri
	Field ent,surf,tri			;picked entity, surface and triangle
	Field px#,py#,pz#			;picked xyz
	Field pu#[1],  pv#[1]  ,pw#[1]  ;picked uvw x 2
	
	Field vx#[2],  vy#[2]  ,vz#[2]  ;vertex xyz
	Field vnx#[2], vny#[2] ,vnz#[2] ;vertex normals
	Field vu#[5],  vv#[5]  ,vw#[5]  ;vertex uvw x 2
End Type

Global g_PickedTri.pickedtri = New pickedtri

Function PickedU#(coordset = 0)
	ptri.pickedtri = g_PickedTri
	If (PickedX()<>ptri\px) Or (PickedY()<>ptri\py) Or (PickedZ()<>ptri\pz) Or (PickedSurface()<>ptri\surf)
		uvwTime=PickedUVW()
	End If
	Return ptri\pu[coordset]
End Function

Function PickedV#(coordset = 0)
	ptri.pickedtri = g_PickedTri

	If (PickedX()<>ptri\px) Or (PickedY()<>ptri\py) Or (PickedZ()<>ptri\pz) Or (PickedSurface()<>ptri\surf)
		uvwTime=PickedUVW()
	End If
	Return ptri\pv[coordset]
End Function

Function PickedW#(coordset = 0)
	ptri.pickedtri = g_PickedTri
	
	If (PickedX()<>ptri\px) Or (PickedY()<>ptri\py) Or (PickedZ()<>ptri\pz) Or (PickedSurface()<>ptri\surf)
		uvwTime=PickedUVW()
	End If
	Return ptri\pw[coordset]
End Function

Function PickedUVW()
	ptri.pickedtri = g_PickedTri

	If EntityClass(PickedEntity()) = "Terrain"
		terrain = PickedEntity()
		tsize# = TerrainSize(terrain)
		
		TFormPoint(PickedX(), PickedY(), PickedZ(), 0, terrain)
		ptri\pu[0] = TFormedX() / tsize
		ptri\pv[0] = 1.0 - (TFormedZ() / tsize)
		
		ptri\pu[1] = ptri\pu[0]
		ptri\pv[1] = ptri\pv[0]
		
		Return True
	EndIf
	
	If PickedSurface()
		ptri\ent  = PickedEntity()
		ptri\surf = PickedSurface()
		ptri\tri  = PickedTriangle()
			
		ptri\px = PickedX()
		ptri\py = PickedY()
		ptri\pz = PickedZ()
		
		For i = 0 To 2
			TFormPoint VertexX(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i)),VertexY(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i)),VertexZ(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i)),ptri\ent,0

			ptri\vx[i] = TFormedX()
			ptri\vy[i] = TFormedY()
			ptri\vz[i] = TFormedZ()

			ptri\vnx[i] = VertexNX(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i))
			ptri\vny[i] = VertexNY(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i))
			ptri\vnz[i] = VertexNZ(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i))
					
			ptri\vu[i+0] = VertexU(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),0)
			ptri\vv[i+0] = VertexV(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),0)
			ptri\vw[i+0] = VertexW(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),0)

			ptri\vu[i+3] = VertexU(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),1)
			ptri\vv[i+3] = VertexV(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),1)
			ptri\vw[i+3] = VertexW(ptri\surf,TriangleVertex(ptri\surf,ptri\tri,i),1)
		Next

		Local coords = 3

		If Abs(PickedNX()) > Abs(PickedNY())
			If Abs(PickedNX())>Abs(PickedNZ()) Then coords = 1
		Else
			If Abs(PickedNY())>Abs(PickedNZ()) Then coords = 2
		EndIf
		
		Local a0#,a1#,b0#,b1#,c0#,c1#
		
		If (coords = 3)
			a0# = ptri\vx[1] - ptri\vx[0]
			a1# = ptri\vy[1] - ptri\vy[0]
			b0# = ptri\vx[2] - ptri\vx[0]
			b1# = ptri\vy[2] - ptri\vy[0]
			c0# = PickedX() - ptri\vx[0]
			c1# = PickedY() - ptri\vy[0]
		Else		
			If (coords = 2)
				a0# = ptri\vx[1] - ptri\vx[0]
				a1# = ptri\vz[1] - ptri\vz[0]
				b0# = ptri\vx[2] - ptri\vx[0]
				b1# = ptri\vz[2] - ptri\vz[0]
				c0# = PickedX() - ptri\vx[0]
				c1# = PickedZ() - ptri\vz[0]
			Else
				a0# = ptri\vy[1] - ptri\vy[0]
				a1# = ptri\vz[1] - ptri\vz[0]
				b0# = ptri\vy[2] - ptri\vy[0]
				b1# = ptri\vz[2] - ptri\vz[0]
				c0# = PickedY() - ptri\vy[0]
				c1# = PickedZ() - ptri\vz[0]
			End If
		End If

		Local u# = (c0*b1 - b0*c1) / (a0*b1 - b0*a1)
		Local v# = (a0*c1 - c0*a1) / (a0*b1 - b0*a1)

		If (u<0.0 Or u>1.0) Or (v<0.0 Or v>1.0)
			Return False
		End If
		
		ptri\pu[0] = (ptri\vu[0] + ((ptri\vu[1] - ptri\vu[0]) * u) + ((ptri\vu[2] - ptri\vu[0]) * v)) Mod 1
		ptri\pv[0] = (ptri\vv[0] + ((ptri\vv[1] - ptri\vv[0]) * u) + ((ptri\vv[2] - ptri\vv[0]) * v)) Mod 1
		ptri\pw[0] = (ptri\vw[0] + ((ptri\vw[1] - ptri\vw[0]) * u) + ((ptri\vw[2] - ptri\vw[0]) * v)) Mod 1

		If ptri\pu[0]<0.0 Then ptri\pu[0] = 1.0 + ptri\pu[0]
		If ptri\pv[0]<0.0 Then ptri\pv[0] = 1.0 + ptri\pv[0]
		If ptri\pw[0]<0.0 Then ptri\pw[0] = 1.0 + ptri\pw[0]
	
		ptri\pu[1] = (ptri\vu[3] + ((ptri\vu[4] - ptri\vu[3]) * u) + ((ptri\vu[5] - ptri\vu[3]) * v)) Mod 1
		ptri\pv[1] = (ptri\vv[3] + ((ptri\vv[4] - ptri\vv[3]) * u) + ((ptri\vv[5] - ptri\vv[3]) * v)) Mod 1
		ptri\pw[1] = (ptri\vw[3] + ((ptri\vw[4] - ptri\vw[3]) * u) + ((ptri\vw[5] - ptri\vw[3]) * v)) Mod 1

		If ptri\pu[1]<0.0 Then ptri\pu[1] = 1.0 + ptri\pu[1]
		If ptri\pv[1]<0.0 Then ptri\pv[1] = 1.0 + ptri\pv[1]
		If ptri\pw[1]<0.0 Then ptri\pw[1] = 1.0 + ptri\pw[1]
		
		Return True
	End If
	
	Return False
End Function

Function Lightmap_Array(lightmap)
LMarray_width#=TextureWidth(lightmap)
LMarray_height#=TextureHeight(lightmap)
Dim Lightmaparray(LMarray_width#,LMarray_height#)
For LoopX=0 To LMArray_width#-1
	For Loopy=0 To LMArray_height#-1
    Lightmaparray(loopx,loopy)=ReadPixel(loopx,loopy,TextureBuffer(tex))      
    Next
Next
End Function 



sniper_boy147(Posted 2009) [#5]
Gunna try it out tomorrow cause its getting late, lol. Thanks for the post! And sorry for the irrelevance, but I was interested in the Hored3d wrapper you were working on. Is there any chance it will be released to the public?


Naughty Alien(Posted 2009) [#6]
..Horde wrapper is a bit buggy, so right now is in house use for sake of saving me from forum cursing because many things are not working :) I will however clean it up soon as i get rid from my game im working on, and it will be released for free... :)