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
|