Character shading

Blitz3D Forums/Blitz3D Programming/Character shading

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Just have a lightmap texture for each object the player can walk on. Then pick below the character. get the UV coords of the pick, then check the lightmap at those UV coords to get the proper color / shade to apply to the character.;

edit: i put somthing together from some code archive submissions that should work. Just call shadeentity on the character and pass the lightmap texture into it.

Function shadeentity(entity,lmaptex,ambient=90)
If LinePick(EntityX(Entity), EntityY(Entity)+10, EntityZ(Entity), 0, -125, 0, 0)
	If PickedUVW()
		Local ARGB# = GetTexColor(lmaptex, PickedU(), PickedV()) And $FFFFFF
        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(tex,u#,v#)
	u#=u#*(TextureWidth(tex)-1)
	v#=v#*(TextureHeight(tex)-1)
	col#=ReadPixel(u,v,TextureBuffer(tex))
	Return col#
End Function

Type PickedTri
	Field ent,surf,tri			
	Field px#,py#,pz#			
	Field pu#[1],  pv#[1]  ,pw#[1]  
    Field vx#[2],  vy#[2]  ,vz#[2]  
	Field vnx#[2], vny#[2] ,vnz#[2] 
	Field vu#[5],  vv#[5]  ,vw#[5]  
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