Ooops
November 25, 2020, 08:45:54 AM

Author Topic: [bb] Omni Light/Normal Mapper by AntonyWells [ 1+ years ago ]  (Read 805 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Omni Light/Normal Mapper
Author : AntonyWells
Posted : 1+ years ago

Description : This is an engine, not an app. It's very easy to use, you just define light sources, caster meshes and reciever meshes.  for lightmapping.

the lightmapping uses a custom leaf texture packer to pack the lightmap into one big texture.
You can define how many pixels(I.e 16x16) each poly in the scene gets.
The lightmapper uses a custom projected 2d volume technique to determine which lumels are shadowed, rather than using linepicks.

The normal mapper generates a per-pixel normal map for the scene, again using the leaf texture packer.
This allows you to do per-pixel lighting. Best suited to characters/props, rather than whole levels.(That's what the lightmapper is for.)
Although it does work pretty nicely on most small rooms(And terrains).
Included is EntityLight, this function transposes a light into object space and sets it's normal vector(I.e entityColor) to point towards the light source. (I.e map your mesh, setup the textures, and then simply use entityLight once per frame for per pixel lighting)


Lemme know if you have any probs getting it to work..wrote this a year back.


Code :
Code: BlitzBasic
  1. Global imap
  2. Global ptri.pickedtri = New pickedtri
  3.  
  4. ;Omni V0.9 Beta 5 - 3D Lighting and normal mapping Engine.
  5. ;
  6. ;Public Domain.
  7. ;
  8. ;Feel free to upload improved versions.
  9. ;
  10. ;Originally wrote by Antony Wells 2003
  11. ;-----
  12.  
  13. ;-{Engine Globals. There are functions to change these, use 'em]
  14. Global lMapWidth#=2048,lMapHeight#=2048
  15. Global chunkWidth#=32,chunkHeight#=256
  16. Const shadeWidth =128,shadeHeight=128
  17. Global lMap.lightMap
  18.  
  19.  
  20.  
  21. ;---Test code]
  22. Graphics3D 640,480,32,2
  23. SetBuffer BackBuffer()
  24.  
  25. room=CreateCube()
  26. FlipMesh room
  27. ScaleMesh room,30,30,30
  28.  
  29. vcam=CreateCamera()
  30.  
  31. ;-
  32.  
  33. Global vest=LoadTexture("units  horn    ex5.bmp")
  34.  
  35. rock=LoadTexture("units horn    ex2.jpg")
  36. tock=LoadTexture("units horn    ex2.jpg")
  37. TextureBlend rock,1
  38. TextureBlend tock,5
  39.  
  40. ;EntityTexture room,rock,0,1
  41. ;ScaleTexture rock,0.2,0.2
  42.  
  43. ;EntityTexture room,rock,0,1
  44.  
  45.  
  46.  
  47. AmbientLight 128,128,128
  48.  
  49.  
  50. ;-
  51.  
  52. ;-
  53.  
  54. ;AddReciever(room,16,16,1)
  55.  
  56.  
  57. lv=CreateSphere()
  58. cube=CreateCube();LoadMesh("unitshovermain.3ds")
  59.  
  60. If Not cube End
  61. EntityColor room,128,0,0
  62. ;EntityTexture cube,tock,0,1
  63.  
  64.  
  65.  
  66.  
  67. ;FitMesh cube,-2,-2,-2,4,4,4
  68. ScaleMesh cube,4,4,4
  69. RotateMesh cube,90,0,0
  70.  
  71. ;EntityTexture cube,rock,0,1
  72.  
  73. EntityTexture room,rock
  74. Local cd[100]
  75. cd[0]=cube
  76.  
  77.  
  78. addreciever(cd[0],256,256,1)
  79.         renderMap(vcam)
  80.  
  81.  
  82.  
  83. Repeat
  84. If KeyDown(57) TextureBlend imap,1 Else TextureBlend imap,4
  85.         TurnEntity vcam,MouseYSpeed(),-MouseXSpeed(),0
  86.         PositionEntity lv,Cos(aaa#)*35,0,Sin(aaa)*35
  87.         aaa#=aaa+1
  88.         If MouseDown(2)
  89.                 PositionEntity lv,EntityX(vcam),EntityY(vcam),EntityZ(vcam)
  90.         EndIf
  91.        
  92.        
  93.         If KeyDown(17) MoveEntity vcam,0,0,0.1
  94.         If KeyDown(31) MoveEntity vcam,0,0,-0.1
  95.         If KeyDown(30) MoveEntity vcam,-0.1,0,0
  96.         If KeyDown(32) MoveEntity vcam,0.1,0,0
  97.         ;-
  98.         UpdateWorld
  99.         RenderWorld
  100.         ;-
  101.         Text 1,1,MouseZ()*0.1
  102.         Flip
  103.                 ;VectorLight(room,lv,MouseZ()*0.1,0)
  104.                 entityLight(cd[0],lv,MouseZ()*0.1,0)
  105.                 For j=0 To 0
  106.         ;               VectorLight(cd[j],lv,MouseZ()*0.1,0)
  107.                 Next
  108.                
  109. Until KeyDown(1)
  110.  
  111.  
  112. Global lMapBlend=3
  113. ;-End of test]
  114.  
  115. ;-[Types]
  116. Type recv ;reciever meshes(Are lit)
  117.         Field id
  118.         Field cW,cH
  119.         Field hull
  120. End Type
  121.  
  122. Type cast ;caster meshes (Cast shadows)
  123.         Field id
  124. End Type
  125.  
  126. Type light ;3d lights
  127.         Field x#,y#,z#
  128.         Field cpiv,r,g,b
  129.         Field fallOff#
  130.         Field typ
  131.         Field shade.shademap[100],sc
  132. End Type
  133.  
  134. ;-Chunks are 'reciever' tris, processed for rendering.
  135. Type chunk
  136.         Field x#[3],y#[3],z#[3]
  137.         Field u#[3],v#[3] ;u,v coords for the lightmap
  138.         Field vi[3],hull
  139.         Field nx#,ny#,nz# ;x,y,z normal of the triangle.
  140.         Field pTex ;which texture plane to map to. (1-3)
  141.         Field lTex ;lightMap texture
  142.         Field srf,mesh,tri,ent
  143.         Field eux#,evx#
  144.         Field euy#,evy#
  145.         Field euz#,evz#,leaf.leaf
  146.         Field ox#,oy#,oz#
  147.         Field tBank
  148.         Field lit,shade
  149.         Field cw,ch
  150.         Field mx#,my#,mz#
  151.         ;real time fx
  152.         Field shim#[3]
  153.         Field cx#,cy#,cz#,entX#,entY#,entZ#
  154. End Type
  155.  
  156. Type shade
  157.         Field x#[2],y#[2],z#[2]
  158.         Field sx#[2],sy#[2]
  159.         Field msh,light.light
  160. End Type
  161.  
  162. Type yl
  163.         Field y[shadeHeight]
  164. End Type
  165. Type shadeMap
  166.         Field img,buf
  167.         Field x.yl[shadeWidth]
  168.         Field light.light,cast.cast
  169. End Type
  170.  
  171.  
  172. Type leaf
  173.         Field leaf.leaf[2]
  174.         Field x#,y#,w#,h#
  175.         Field on
  176. End Type
  177.  
  178. Type lightMap
  179.         Field texMap,texBuf
  180.         Field sW,sH
  181.         Field tree.leaf,scam
  182. End Type
  183.  
  184. ;shadow maps
  185.  
  186. ;--- [ Engine control ]
  187. Function lightMapSize( width#,height#)
  188.         lMapWidth =width
  189.         lMapHeight =height
  190. End Function
  191.  
  192. Function chunkSize( width#,height#)
  193.         chunkWidth =width
  194.         chunkHeight =height
  195. End Function
  196. Function shadeMapSize( width,height)
  197.         lMapsw =width
  198.         lMapsh =height
  199. End Function
  200.  
  201.  
  202. Function ligtMapBlend( mode=2)
  203.         lMapBlend =mode
  204. End Function
  205.  
  206. ;--- [ Special Fx ] ;you must retain chunks for fx to work.
  207. Global aa=0
  208. Function shadowShimmer() ;disabled for now.
  209.  
  210. End Function
  211.  
  212.  
  213. ;--- [ Scene Building ]
  214. Function addReciever(mesh,cw=128,ch=128,hull=False)
  215.         recv.recv =New recv
  216.         recvid =mesh
  217.         recvcw=cw
  218.         recvch=ch
  219.         recvhull=hull
  220.         ;EntityFX mesh,2
  221. End Function
  222.  
  223. Function addCaster(mesh)
  224.         cast.cast =New cast
  225.         castid =mesh
  226. End Function
  227.  
  228.  
  229. Const cOmni=1,cDirectional=2
  230. Function addOmniLight.light(x#,y#,z#,r#=128,g#=128,b#=128,fallOff#=10)
  231.         light.light =New light
  232.         lightx =x
  233.         lighty =y
  234.         lightz =z
  235.         light
  236.  =r
  237.         lightg =g
  238.         light =b
  239.         lightfallOff=fallOff
  240.         Return light
  241. End Function
  242.  
  243. Function renderMap(cam=0,mode=1)
  244. Local x#[5],y#[5],z#[5],v#[5]
  245.         For recv.recv =Each recv
  246.                 EntityPickMode recvid,2,True
  247.                 HideEntity recvid
  248.         Next
  249.         For cast.cast =Each cast
  250.                 HideEntity castid
  251.         Next
  252.         CameraViewport cam,0,0,shadeWidth,shadeHeight
  253.         CameraZoom cam,1.8
  254.         mapWidth =GraphicsWidth()
  255.         mapHeight =GraphicsHeight()
  256.  
  257.         For light.light =Each light
  258.                 PositionEntity cam,lightx,lighty,lightz
  259.                 For cast.cast =Each cast
  260.                         lightshade[lightsc] =New shadeMap
  261.                         shademap.shademap =lightshade[lightsc]
  262.                         lightsc=lightsc+1
  263.                         shadeMapcast =cast
  264.                         PointEntity cam,castid
  265.                         ShowEntity castid
  266.                         Cls
  267.                         RenderWorld
  268.                         HideEntity castid
  269.                         LockBuffer
  270.                         For px=0 To shadeWidth-1
  271.                                 For py=0 To shadeHeight-1
  272.                                         ;pix =ReadPixelFast(px,py)
  273.                                         If ((ReadPixelFast(px,py) Shr 16) And 255)
  274.                                                 If shadeMapx[px]=Null shadeMapx[px] =New yl
  275.                                                 shadeMapx[px]y[py] =True
  276.                                         EndIf
  277.                                 Next
  278.                         Next
  279.                         UnlockBuffer
  280.                 Next
  281.                
  282.         Next
  283.        
  284.        
  285.        
  286.         For cast.cast =Each cast
  287.                 ShowEntity castid
  288.         Next
  289.        
  290.        
  291.         Goto skipnew
  292.         For light.light =Each light ;create shadow segs'
  293.         PositionEntity cam,lightx,lighty,lightz
  294.         For cast.cast =Each cast
  295.                 PointEntity cam,castid
  296.                 For sc =1 To CountSurfaces( castid)
  297.                         srf =GetSurface( castid,sc)
  298.                         For t=1 To CountTriangles( srf)
  299.                                 shade.shade =New shade
  300.                                 shademsh =castid
  301.                                 shadelight =light
  302.                                 sa=sa+1
  303.                                 For vt=0 To 2
  304.                                         v1 =TriangleVertex(srf,t,vt)
  305.                                         If v1=<CountVertices(srf)
  306.                                                 CameraProject cam,VertexX(srf,v1),VertexY(srf,v1),VertexZ(srf,v1)
  307.                                                 shadesx[vt] =ProjectedX()
  308.                                                 shadesy[vt] =ProjectedY()
  309.                                         Else
  310.                                                 Delete shade
  311.                                                 Goto skipS
  312.                                         EndIf
  313.                                        
  314.                                         Next
  315.                                 Next
  316.                         .skipS
  317.                         Next
  318.                
  319.                 Next
  320.                
  321.         Next
  322.         .skipnew
  323.        
  324.         createLightMap()
  325.         If cam setLightCam(cam)
  326.         For recv.recv =Each recv
  327.                 cx#=EntityX(recvid)
  328.                 cy#=EntityY(recvid)
  329.                 cz#=EntityZ(recvid)
  330.                 ;recvcx=cx
  331.         ;       recvcy=cy
  332.         ;       recvcz=cz
  333.                
  334.                 unweld(recvid)
  335.                 HideEntity recvid
  336.                 EntityTexture recvid,lMap       exMap,0,0
  337.         ;       EntityFX recvid,1
  338.                 sC =CountSurfaces( recvid)
  339.                 ;UpdateNormals recvid
  340.                 If sc
  341.                         For s=1 To sc
  342.                                 srf =GetSurface( recvid,s)
  343.                                 tris =CountTriangles( srf)
  344.                        
  345.                                 For tri=0 To tris
  346.                                         chunk.chunk =New chunk
  347.                                         chunkcx=cx
  348.                                         chunkcy=cy
  349.                                         chunkcz=cz
  350.                                         chunk   ri=tri
  351.                                         chunkent=recvid
  352.                                         chunksrf=srf
  353.                                         chunkentX=EntityY(recvid)
  354.                                         chunkentY=EntityX(recvid)
  355.                                         chunkentZ=EntityZ(recvid)
  356.                                         chunkhull=recvhull
  357.                                        
  358.                                         chunkcw =recvcw
  359.                                         chunkmesh =recvid
  360.                                         chunkch =recvch
  361.                                         chunksrf =srf
  362.                                         chunklit =True 
  363.                                         For vt=0 To 2
  364.                                                 vi =TriangleVertex(srf,tri,vt)
  365.                                                 If vi<CountVertices(srf)
  366.                                                         x[vt] =VertexX( srf,vi)
  367.                                                         y[vt] =VertexY( srf,vi)
  368.                                                         z[vt] =VertexZ( srf,vi)
  369.                                                         chunkx[vt] =x[vt]
  370.                                                         chunky[vt] =y[vt]
  371.                                                         chunkz[vt] =z[vt]
  372.                                                         chunkvi[vt] =vi
  373.                                                 Else
  374.                                                         Delete chunk
  375.                                                         Goto skipChunk
  376.                                                 EndIf
  377.                                         Next
  378.                                         triNorm( chunkx[0],chunky[0],chunkz[0],chunkx[1],chunky[1],chunkz[1],chunkx[2],chunky[2],chunkz[2])
  379.                                         nx#=tnormX()
  380.                                         ny#=tnormY()
  381.                                         nz#=tnormZ()
  382.                                        
  383.                                
  384.                                        
  385.                                                                
  386.                                         If Abs(nx)>Abs(ny) And Abs(nx)>Abs(nz)
  387.                                                 chunkpTex =1
  388.                                                 ;map onto yz-plane
  389.                                         Else
  390.                                                 If Abs(ny)>Abs(nx) And Abs(ny)>Abs(nz)
  391.                                                         chunkpTex =2
  392.                                                 Else
  393.                                                         chunkpTex =3
  394.                                                 EndIf
  395.                                         EndIf
  396.                                         .skipChunk                                                             
  397.                                 Next
  398.                         Next
  399.                 EndIf
  400.                
  401.         Next
  402.         If mode=1 tr =normalChunks()
  403.         If mode=2 tr =lightChunks()
  404.         For recv.recv =Each recv
  405.                 ;UpdateNormals recvid
  406.                 ShowEntity recvid
  407.         Next
  408.         CameraViewport cam,0,0,GraphicsWidth(),GraphicsHeight()
  409.         CameraZoom cam,1
  410.         For cast.cast =Each cast
  411.                 ShowEntity castid
  412.         Next
  413.         SetBuffer BackBuffer()
  414.         Return sa
  415. End Function
  416.  
  417. Function big#(v0#,v1#,v2#)
  418.         If v0>v1
  419.                 If v0>v2
  420.                         Return v0
  421.                 Else
  422.                         Return v2
  423.                 EndIf
  424.         Else
  425.                 If v1>v2
  426.                         Return v1
  427.                 Else   
  428.                         Return v2
  429.                 EndIf
  430.         EndIf
  431. End Function
  432.  
  433. Function small#(v0#,v1#,v2#)
  434.         If v0<v1
  435.                 If v0<v2
  436.                         Return v0
  437.                 Else
  438.                         Return v2
  439.                 EndIf
  440.         Else
  441.                 If v1<v2
  442.                         Return v1
  443.                 Else   
  444.                         Return v2
  445.                 EndIf
  446.         EndIf
  447. End Function
  448.  
  449.  
  450. Function vectorLight(entity,light,inten#=0.5,hull)
  451.         ox#=EntityX(light)
  452.         oy#=EntityY(light)
  453.        
  454.         oz#=EntityZ(light)
  455.         ;If Not hull inten=-inten
  456.         tp=CreatePivot()
  457.         PositionEntity tp,EntityX(light),EntityY(light),EntityZ(light)
  458.         TFormPoint ox,oy,oz,tp,entity
  459.         ;FreeEntity tp
  460.         light=tp
  461.        
  462.         PositionEntity light,TFormedX(),TFormedY(),TFormedZ() ;Transpose light into
  463.         srf=CountSurfaces(Entity)
  464.         lx#=EntityX(light)
  465.         ly#=EntityY(light)
  466.         lz#=EntityZ(light)
  467.  
  468.         cs=CountSurfaces(entity)
  469.         For s=1 To cs
  470.                 srf=GetSurface(entity,s)
  471.                 For v=0 To CountVertices(srf)-1
  472.                         vx#=VertexX(srf,v)
  473.                         vy#=VertexY(Srf,v)
  474.                         vz#=VertexZ(srf,v)
  475.                         dx# =(lx-vx)
  476.                         dy# =(ly-vy)
  477.                         dz# =(lz-vz)
  478.                         tdx#=vx-lx
  479.                         tdy#=vy-ly
  480.                         tdz#=vz-lz
  481.                 ;       tl#=Sqr(tdx*tdx+tdy*tdy*+tdz*tdz)
  482.                 ;       dx=(dx/tl)*inten
  483.                 ;       dy=(dy/tl)*inten
  484.                         ;dz=(dz/tl)*inten
  485.                         nl#=Sqr(tdx*tdx+tdy*tdy+tdz*tdz)
  486.                         nx#=dx/nl
  487.                         ny#=dy/nl
  488.                         nz#=dz/nl
  489.                         nl#=(nl*10.-255.)/255.
  490.        
  491.                         nl=1-nl
  492.        
  493.         If nl>1 nl=1
  494.         If nl<0 nl=0
  495.         nl=in
  496.  
  497.         nx=nx*inten
  498.         ny=ny*inten
  499.         nz=nz*inten
  500.  
  501.                        
  502.                         VertexColor srf,v,128+(128*nx),128+(128*nz),128+(128*ny)
  503.                 Next
  504.  
  505.         Next
  506.         FreeEntity tp
  507. End Function
  508.  
  509.  
  510. Function old()
  511. For v=0 To CountVertices(srf)-1
  512.                         vx#=VertexX(srf,v)
  513.                         vy#=VertexY(Srf,v)
  514.                         vz#=VertexZ(srf,v)
  515.                         dx# =(lx-vx)
  516.                         dy# =(ly-vy)
  517.                         dz# =(lz-vz)
  518.                         tdx#=vx-lx
  519.                         tdy#=vy-ly
  520.                         tdz#=vz-lz
  521.                 ;       tl#=Sqr(tdx*tdx+tdy*tdy*+tdz*tdz)
  522.                 ;       dx=(dx/tl)*inten
  523.                 ;       dy=(dy/tl)*inten
  524.                         ;dz=(dz/tl)*inten
  525.                         nl#=Sqr(tdx*tdx+tdy*tdy+tdz*tdz)
  526.                         nx#=dx/nl
  527.                         ny#=dy/nl
  528.                         nz#=dz/nl
  529.                         nl#=(nl*10.-255.)/255.
  530.        
  531.                         nl=1-nl
  532.        
  533.         If nl>1 nl=1
  534.         If nl<0 nl=0
  535.         nl=in
  536.  
  537.         nx=nx*inten
  538.         ny=ny*inten
  539.         nz=nz*inten
  540.  
  541.                        
  542.                         VertexColor srf,v,128+(128*nx),128+(128*nz),128+(128*ny)
  543.                 Next
  544. End Function
  545.  
  546.  
  547. Function entityLight(entity,light,inten#=0.5,hull=False)
  548.         ox#=EntityX(light)
  549.         oy#=EntityY(light)
  550.         oz#=EntityZ(light)
  551.         inten =0.5
  552. ;       If Not hull inten=1.-inten
  553.         tp=CreatePivot()
  554.         PositionEntity tp,EntityX(light),EntityY(light),EntityZ(light)
  555.         TFormPoint ox,oy,oz,tp,entity
  556.         ;FreeEntity tp
  557.         light=tp
  558.        
  559.         PositionEntity light,TFormedX(),TFormedY(),TFormedZ() ;Transpose light into
  560.         dx# =(EntityX(light)-EntityX( entity));*inten
  561.         dy# =(EntityY(light)-EntityY( entity));*inten
  562.         dz# =(EntityZ(light)-EntityZ( entity));*inten
  563.        
  564.         nl#=Sqr(dx*dx+dy*dy+dz*dz)
  565.         nx#=dx/nl
  566.         ny#=dy/nl
  567.         nz#=dz/nl
  568.         nl#=(nl*10.-255.)/255.
  569.        
  570.         nl=1.-nl
  571.        
  572.         If nl>1. nl=1
  573.         If nl<0. nl=0
  574.         nl=in
  575.  
  576.         nx=nx;*inten
  577.         ny=ny;*inten
  578.         nz=nz;*inten
  579.        
  580.         ;nz=(Sgn(nz))+nz
  581.         ;nx=(Sgn(nx))+nx
  582.         ;ny=(Sgn(ny))+ny
  583.        
  584. ;       If nx<0 nx
  585.                
  586.                
  587.         FreeEntity tp
  588.         EntityColor entity,128.+(128.*nx),128.+(128.*nz),128.+(128.*ny)
  589.        
  590.  
  591.         ;EntityColor entity,256+(256*nx),256.0+(256*ny),256.0+(256*nt)
  592.        
  593. ;       PositionEntity light,ox,oy,oz ;return light.
  594. End Function
  595.  
  596.  
  597. Function createLightMap()
  598.         lMap.lightMap =New lightMap
  599.         lmap    exMap =CreateTexture(lMapWidth,lMapHeight,8)
  600.         lmap    exBuf =TextureBuffer(lMap       exMap)
  601.         TextureCoords lmap      exMap,1 ;set to the second u,v set.
  602.          imap=lmap      exmap
  603.        
  604.         TextureBlend lmap       exMap,3
  605. End Function
  606. Function setLightCam(cam)
  607.         lmapscam =cam
  608.         CameraClsMode lmapscam,False,True
  609. End Function
  610.  
  611. ;-- [ Leaf Engine] ;packs multiple textures into 1 'larger' texture
  612. Function newLeaf.leaf(texture) ;returns leaf object that holds the tex.
  613.         width =TextureWidth(texture)
  614.         height =TextureHeight(texture)
  615.         If width<1 Or height<1 Return
  616.         If lMap ree =Null ;first image
  617.                 lMap    ree =New leaf
  618.                 lMap    reew =lMapWidth
  619.                 lMap    reeh =lMapHeight
  620.         EndIf
  621.         For leaf.leaf =Each leaf
  622.                 out.leaf =insertLeaf( leaf,texture)
  623.                 If out<>Null Return out
  624.         Next
  625.         ;Return addLeaf( lMap   ree,texture)
  626. End Function
  627.  
  628.  
  629. Function insertLeaf.leaf( leaf.leaf,texture)
  630. width =TextureWidth(texture)
  631. height =TextureHeight(texture) 
  632.        
  633. If leafon Return
  634.        
  635.         If width<=leafw And height<=leafh ;fits
  636.                 leafon =True
  637.  
  638.                 leafleaf[0] =New leaf
  639.                 leafleaf[1] =New leaf
  640.                 leafleaf[0]x =leafx+width
  641.                 leafleaf[0]y =leafy
  642.                 leafleaf[0]w =leafw-width-1
  643.                 leafleaf[0]h =height
  644.                                
  645.                 leafleaf[1]x =leafx
  646.                 leafleaf[1]y =leafy+height
  647.                 leafleaf[1]w =leafw
  648.                 leafleaf[1]h =leafh-height
  649.                
  650.                 leafw =width
  651.                 leafh =height
  652.                 CopyRect 0,0,width,height,leafx,leafy,TextureBuffer(texture),lMap       exBuf
  653.                 Return leaf
  654.         EndIf
  655. End Function
  656.  
  657.  
  658. Function addLeaf.leaf( leaf.leaf,texture) ;internal function
  659. Local nleaf.leaf
  660.         width =TextureWidth(texture)
  661.         height =TextureHeight(texture)
  662.  
  663. If leafon
  664.  
  665.     nleaf =insertLeaf( leafleaf[0],texture)
  666.         If nleaf<>Null Return nleaf
  667.         nleaf =insertLeaf( leafleaf[1],texture)
  668.         If nleaf<>Null Return nleaf
  669. Else
  670.         nleaf =insertLeaf( leaf,texture)
  671.         If nleaf<>Null Return nleaf
  672. EndIf
  673.        
  674. End Function
  675.  
  676. Function leafU#(leaf.leaf,u#) ;converts a normal u coord into a lightmap u coord
  677.         Return ((leafx+1)+((leafw-2)*u))/lMapWidth
  678. End Function
  679.  
  680. Function leafV#(leaf.leaf,v#)
  681.         Return ((leafy+1)+((leafh-2)*v))/lMapHeight
  682. End Function
  683.  
  684. Function textureNorm(tex)
  685.         SetBuffer TextureBuffer(Tex)
  686.         tw#=TextureWidth(Tex)
  687.         th#=TextureHeight(tex)
  688.         LockBuffer
  689.         For x=0 To tw-1
  690.         For y=0 To th-1
  691.                 cv=ReadPixelFast(x,y)
  692.                 r=(cv Shr 16) And 255
  693.                 g=(cv Shr 8) And 255
  694.                 b=(cv And 255)
  695.                 cv=(r+g+b)/3.
  696.                 nx#=128
  697.                 ny#=128
  698.                 nz#=cv
  699.                 rgb = nz Or (ny Shl 8) Or (nx Shl 16)
  700.                 WritePixelFast x,y,rgb
  701.         Next
  702.         Next
  703.         UnlockBuffer
  704.         SetBuffer BackBuffer()
  705. End Function
  706.  
  707.  
  708. Function NormalChunks() ;final chunk 'prep' before rendering
  709. Local miU#,miV#
  710. Local maU#,maV#,rU#,rV#
  711. Local u#[3],v#[3]
  712. Local spiv =CreatePivot(),lpiv1=CreatePivot()
  713. Local lpiv2 =CreatePivot(),lpiv3 =CreatePivot()
  714.  
  715. For chunk.chunk =Each chunk
  716. If chunklit
  717.                 ;-fx
  718.                
  719.                 ;----
  720.                 For vt=0 To 2
  721.                         chunkshim[vt] =Rnd(360)
  722.                         Select chunkpTex
  723.                                 Case 1 ;yz
  724.                                         u[vt] =chunky[vt]
  725.                                         v[vt] =chunkz[vt]
  726.                                 Case 2 ;xz
  727.                                         u[vt] =chunkx[vt]
  728.                                         v[vt] =chunkz[vt]
  729.                                 Case 3 ;xy
  730.                                         u[vt] =chunkx[vt]
  731.                                         v[vt] =chunky[vt]
  732.                                 Default
  733.                                         RuntimeError "Illegal projection plane"
  734.                         End Select
  735.                 Next
  736.                 triNorm( chunkx[0],chunky[0],chunkz[0],chunkx[1],chunky[1],chunkz[1],chunkx[2],chunky[2],chunkz[2])
  737.                
  738.                 ;TriNorm( x[0],y[0],z[0],x[1],y[1],z[1],x[2],y[2],z[2])
  739.                 chunk
  740. X# =tNormX()
  741.                 chunk
  742. y =tNormY()
  743.                 chunk
  744. z =tNormZ()
  745.                                        
  746.                                
  747.                
  748.                                        
  749.                
  750.                 ;tnx#=chunk
  751. x
  752.                 ;tny#=chunk
  753. y
  754.                 ;tnz#=chunk
  755. z
  756.                
  757.                
  758.                 ;map u,v into valid 0,1 range.
  759.                 miU = 9999
  760.                 miV = 9999
  761.                 maU = -9999
  762.                 maV = -9999
  763.                 For i=0 To 2
  764.                         If u[i]<miU
  765.                                 miU =u[i]
  766.                         EndIf
  767.                         If u[i]>maU
  768.                                 maU =u[i]
  769.                         EndIf
  770.                         If v[i]<miV
  771.                                 miV =v[i]
  772.                         EndIf
  773.                         If v[i]>maV
  774.                                 maV =v[i]
  775.                         EndIf
  776.                 Next
  777.                
  778.        
  779.                 rU =maU -miU
  780.                 rV =maV -miV
  781.                
  782.        
  783.                 mapWidth =chunkcw
  784.                 mapHeight =chunkch
  785.        
  786.                 tempMap =CreateTexture( mapWidth,mapHeight,256)
  787.                 If Not tempMap Return
  788.                 For vt=0 To 2
  789.                         chunku[vt] =(u[vt]-miU) /rU
  790.                         chunkv[vt] =(v[vt]-miV) /rV
  791.                 Next
  792.                
  793.        
  794.         dist# = -(chunk
  795. x * chunkx[0]+chunk
  796. y*chunky[1]+chunk
  797. z*chunkz[2])
  798.                 Select chunkpTex
  799.                         Case 3
  800.                        
  801.                                 Z# = -(chunk
  802. x*miU + chunk
  803. y * miV + Dist) / chunk
  804. z
  805.                                 uvx# = miu : UVY# = miV : UVZ# = Z
  806.                                 Z# = -(chunkNX * maU + chunkNY * miV + Dist) / chunkNZ
  807.                                 V1X# = maU : V1Y# = miV : V1Z# = Z
  808.                                 Z# = -(chunkNX * miu + chunkNY * maV + Dist) / chunkNZ
  809.                                 V2X# = miu : V2Y# = maV : V2Z# = Z
  810.                         Case 2
  811.                                 Y# = -(chunkNX * miu + chunkNZ * miV + Dist) / chunkNY
  812.                                 UVX# = miu : UVY# = Y : UVZ# = miV
  813.                                 Y# = -(chunkNX * maU + chunkNZ * miV + Dist) / chunkNY
  814.                                 V1X# = maU : V1Y# = Y : V1Z# = miV
  815.                                 Y# = -(chunkNX * miu + chunkNZ * maV + Dist) / chunkNY
  816.                                 V2X# = miu : V2Y# = Y : V2Z# = maV
  817.                         Case 1         
  818.                                 X# = -(chunkNY * miu + chunkNZ * miV + Dist) / chunkNX
  819.                                 UVX# = X : UVY# = miu : UVZ# = miV
  820.                                 X# = -(chunkNY * maU + chunkNZ * miV + Dist) / chunkNX 
  821.                                 V1X# = X : V1Y# = maU : V1Z# = miV     
  822.                                 X# = -(chunkNY * miu + chunkNZ * maV + Dist) / chunkNX
  823.                                 V2X# = X : V2Y# = miu : V2Z# = maV
  824.                 End Select
  825.                 chunkeux = V1X - UVX : chunkeuy = V1Y - UVY : chunkeuz = V1Z - UVZ
  826.                 chunkevx = V2X - UVX : chunkevy = V2Y - UVY : chunkevz = V2Z - UVZ
  827.                 chunkox = UVX# : chunkoy = UVY# : chunkoz = UVZ#
  828.  
  829.                 ;dx# =chunkox
  830.                
  831.                 ox#=md( chunkx[0],chunkx[1],chunkx[2])
  832.                 oy#=md( chunky[0],chunky[1],chunky[2])
  833.                 oz#=md( chunkz[0],chunkz[1],chunkz[2])
  834.         ;       ox=ox+chunkcx
  835.                
  836.                 ;DebugLog chunkcx+" Oy>"+chunkcy+" oz>"+chunkcz
  837.                 If chunkhull
  838.         ox=-ox
  839.                         oy=-oy
  840.                         oz=-oz
  841.                 ;       dx#=ox-chunkcx
  842.                 ;       dy#=oy-chunkcy
  843.                 ;       dz#=oz-chunkcz 
  844.                 Else
  845.                 ;       dx =chunkcx-ox
  846.                 ;       dy =chunkcy-oy
  847.                 ;       dz =chunkcz-oz
  848.                        
  849.                 EndIf  
  850.         ;       ox=ox-chunkcx
  851.         ;       oy=oy-chunkcy
  852.         ;       oz=oz-chunkcz
  853.                
  854.                 ;nl# =Sqr(ox*ox+oy*oy+oz*oz)
  855.         ;       tnx#=(ox)/nl
  856.         ;       tny#=(oy)/nl
  857.         ;       tnz#=(oz)/nl
  858.         ;       ox=chunkcx+ox
  859.         ;       oy=chunkcy+oy
  860.         ;       oz=chunkcz+oz
  861.                
  862.         ;       cc=CreateCube()
  863.         ;       FitMesh cc, -0.2,-0.2,-0.2,0.4,0.4,0.4
  864.         ;       PositionEntity cc,ox,oy,oz
  865.                
  866.         ;       vp=CreateCube()
  867.         ;       FitMesh vp,-0.2,-0.2,-.2,0.4,0.4,0.4
  868.         ;       PositionEntity vp,chunkcx,chunkcy,chunkcz
  869.        
  870.                 If mapWidth<>laW Or mapHeight<>laH
  871.                         laW =mapWidth
  872.                         laH =mapHeight
  873.                         If tmpImg FreeImage tmpImg
  874.                         tmpImg =CreateImage(mapWidth,mapHeight)
  875.                         tmpBuf =ImageBuffer(tmpImg)
  876.                         SetBuffer tmpBuf
  877.                 EndIf
  878.                 LockBuffer tmpBuf
  879.                 LockBuffer TextureBuffer(vest)
  880.                 rv#=128.+(128.*tnx)
  881.                 bv#=128.+(128.*tny)
  882.                 gv#=128.+(128.*tnz)
  883.                 ;rv=Rnd(255)
  884.                 ;EntityColor cc,255,255,255
  885.                 vb=TextureBuffer(vest)
  886.                 entX#=chunkentX
  887.                 entY#=chunkentY
  888.                 entZ#=chunkentZ
  889.                 If chunkhull dir#=1 Else dir=-1
  890.                 PositionEntity spiv,chunkcx,chunkcy,chunkcz
  891.                 tw#=TextureWidth(vest)
  892.                 th#=TextureHeight(vest)
  893.                
  894.                 For x#=0 To mapWidth-1
  895.                         au# = x/mapwidth
  896.                         N_UEdgeX# = chunkEuX * au#  :  N_UEdgeY# = chunkeuY * au#  :  N_UEdgeZ# = chunkeuZ * au#
  897.                 For y#=0 To mapHeight-1
  898.                         av# = y/mapHeight              
  899.                         N_VEdgeX# = chunkevX * av#  :  N_VEdgeY# = chunkevY * av#  :  N_VEdgeZ# = chunkevZ * av#
  900.                         lx# = (chunkox + N_UEdgeX + N_VEdgeX)
  901.                         ly# = (chunkoy + N_UEdgeY + N_VEdgeY)
  902.                         lz# = (chunkoz + N_UEdgeZ + N_VEdgeZ)
  903.                
  904.                        
  905.                         td#=Sqr(lx*lx+ly*ly+lz*lz)
  906.                         nox#=lx/td ;*Rnd(0.75,1.25)
  907.                         noz#=ly/td ;'*Rnd(0.75,1.25)
  908.                         noy#=lz/td
  909.                        
  910.                        
  911.                        
  912.                 ;       shaded =False
  913.                 ;       lcast.cast=Null
  914.                 ;       r1=0
  915.                         ;g1=0
  916.                 ;       b1=0
  917.        
  918.                 ;       For light.light =Each light
  919.                 ;               PositionEntity lmapscam,lightx,lighty,lightz
  920.                 ;               shaded=False
  921.                 ;               If lightsc
  922.                 ;               For j=0 To lightsc-1
  923.                 ;                       shade.shadeMap =lightshade[j]
  924.                 ;                       PointEntity lmapscam,shadecastid
  925.                 ;                       If shadecastid =chunkmesh Goto skips
  926.                 ;                       CameraProject lmapscam,lx,ly,lz
  927.                 ;                       px =ProjectedX()
  928.                 ;                       If px>0 And px<shadeWidth
  929.                 ;                       If shadex[px]<>Null
  930.                 ;                               py =ProjectedY()
  931.                 ;                               If py>0 And py<shadeHeight
  932.                 ;                                       shaded =shadex[px]y[py]
  933.                 ;                                       If shaded Exit
  934.                 ;                               EndIf
  935.                 ;                       EndIf
  936.                 ;                       EndIf
  937.                 ;                       .skips
  938.                 ;               Next
  939.                 ;               EndIf
  940.                 ;               If Not shaded
  941.                                
  942.                 ;                       PositionEntity spiv,lightx,lighty,lightz
  943.                 ;                       ed# =(EntityDistance(spiv,lpiv1)*lightfallOff)
  944.                 ;                      
  945.                 ;                       r1=(light
  946. -ed)
  947.                 ;                       g1=(lightg-ed)
  948.                 ;                       b1=(light-ed)
  949.                 ;                       If r1<0 r1=0
  950.                 ;                       If g1<0 g1=0
  951.                 ;                       If b1<0 b1=0
  952.                 ;                       rv=rv+r1
  953.                 ;                       gv=gv+g1
  954.                 ;                       bv=bv+b1
  955.                 ;               Else
  956.                                
  957.                 ;               EndIf
  958.                 ;       Next
  959.                 ;       If rv>255 rv=255
  960.                 ;       If gv>255 gv=255
  961.                 ;       If bv>255 bv=255
  962.                         ;If r1<0 rv=0
  963.                         ;If g1<0 gv=0
  964.                         ;If b1<0 bv=0  
  965.                                
  966.                 ;       xd#=(lx-chunkcx)
  967.                 ;       yd#=(ly-chunkcy)
  968.                 ;       zd#=(lz-chunkcz)
  969.                         ;I;f chunkhull=False
  970.                         ;       xd=0
  971.                         ;       yd=0
  972.                         ;       zd=0                   
  973.                         ;EndIf
  974.                        
  975.                        
  976.                 ;       ld#=Sqr(xd*Xd+Yd*Yd+zd*zd)
  977.                 ;       PositionEntity lpiv1,lx,ly,lz
  978.                 ;       ld#=EntityDistance(lpiv1,spiv)
  979.                         ;ld=-dist
  980.                        
  981.                 ;       anx#=xd/ld
  982.                 ;       any#=yd/ld
  983.                 ;Function PickedUVW(ent,surf,tri,x#,y#,z#,nx#,ny#,nz#)
  984.                 pickedUVW(chunkent,chunksrf,chunk       ri,lx,ly,lz,chunk
  985. x,chunk
  986. y,chunk
  987. z)
  988.                 ssu#=pickedU()
  989.                 ssv#=pickedV()
  990.                 ax#=tw*ssu
  991.                 ay#=th*ssv
  992.                 ;If ax>tw-1 ax=tw-1
  993.                 ;If ay>th-1 ay=th-1
  994.                 ;If ax<0 ax=0
  995.                 ;If ay<0 ay=0
  996.                         ab=ReadPixelFast(ax,ay,vb)
  997.                         ar=(ab Shr 16) And 255
  998.                         ag=(ab Shr 8) And 255
  999.                         ab=(ab And 255)
  1000.                 ;       anz#=zd/ld  ;+((ag/255)-1)
  1001.                 ;       any=any+ag
  1002.                        
  1003.                         ;anx=ar
  1004.                         ;any=ag
  1005.                        
  1006.                         ;anz=ab
  1007.                 ;       anx#=tnx#+Rnd(-0.001,0.001)
  1008.                 ;       any#=tny#+Rnd(-0.001,0.001)
  1009.                 ;       anz#=tnz#+Rnd(-0.001,0.001)
  1010.                 ;       anx=tnx+Cos(x)
  1011.                 ;       any=tny+Sin(y)
  1012.                 ;       anz=tnz
  1013.                
  1014.                 vx#=((ar)/255.0)
  1015.                 vz#=((ag)/255.0)
  1016.                 vy#=((ab)/255.0)
  1017.                 vx#=-1.+vx*2.
  1018.                 vy#=-1.+vy*2. ;bring vector into valid -1,1 range
  1019.                 vz#=-1.+vz*2.
  1020.                
  1021.         ;       If vx>1 End
  1022.                 ;PointEntity lpiv1,spiv
  1023.                 ;PointEntity spiv,lpiv1
  1024.                
  1025.        
  1026.                 ;AlignToVector spiv,nox,noy,noz,0
  1027.                
  1028.                 ;AlignToVector spiv,nox,noy,noz,2
  1029.                
  1030.                
  1031.        
  1032.                 TFormVector2(vx,vy,vz,nox,noy,noz)
  1033.                 ar=128.0+(128.0*TFormedX())
  1034.                 ag=128.0+(128.0*TFormedY())
  1035.                 ab=128.0+(128.0*TFormedZ())
  1036.                
  1037.                 ;ar=128
  1038.                 ;ag=128
  1039.                 ;ab=128
  1040.                
  1041.                
  1042.                
  1043.                 ;ar=vx*anx
  1044.                
  1045.         ;;      ag=vy*any
  1046.         ;       ab=vz*anz
  1047.                 ;ar=128.+(128.*vx)
  1048.                 ;ag=128.+(128.*vy)
  1049.                 ;ab=128.+(128.*vz)     
  1050.         ;       anx=anx*vx
  1051.         ;       any=any*vy
  1052.         ;       anz=anz*vz
  1053.         ;       rv#=128.+(128.*anx)
  1054.         ;       bv#=128.+(128.*any)
  1055.         ;       gv#=128.+(128.*anz)
  1056.         ;       ar=(ar-128)*2
  1057.         ;       ag=(ag-128)*2
  1058.         ;       ab=(ab-128)*2
  1059.         ;       rv=rv+ar
  1060.         ;       gv=gv+ag
  1061.         ;       bv=bv+ab
  1062.                
  1063.                
  1064.         ;       rv#=(0.5+(nox/2.0))*255.
  1065.         ;       gv#=(0.5+(noy/2.0))*255.
  1066.         ;       bv#=(0.5+(noz/2.0))*255.
  1067.                        
  1068.                 rv=ar
  1069.                 gv=ag
  1070.                 bv=ab  
  1071.                 If rv<0 rv=0
  1072.                 If gv<0 gv=0
  1073.                 If bv<0 bv=0
  1074.                 If rv>255 rv=255
  1075.                 If gv>255 gv=255
  1076.                 If bv>255 bv=255
  1077.                 ;       bv=ar
  1078.                 ;       rv=ag
  1079.                        
  1080.                 ;       gv=ab;+Rnd(-20,20)
  1081.                         arg = bv Or (gv Shl 8) Or (rv Shl 16)  
  1082.                         WritePixelFast x,y,arg
  1083.                 Next
  1084.                 Next
  1085.                 UnlockBuffer tmpBuf
  1086.                 UnlockBuffer TextureBuffer(vest)
  1087.                 SetBuffer TextureBuffer(tempMap)
  1088.                 DrawBlock tmpImg,0,0
  1089.                 SetBuffer tmpBuf        
  1090.         ;CopyRect 0,0,mapWidth,mapHeight,0,0,tmpBuf,TextureBuffer(tempMap)
  1091.                
  1092.  
  1093.        
  1094.                
  1095.  
  1096.                
  1097.                 ;-
  1098.                 leaf.leaf =newLeaf(tempMap)
  1099.                 chunkleaf =leaf
  1100.                 FreeTexture tempMap
  1101.                 For vt=0 To 2 ;map lightmap onto mesh
  1102.                         chunku[vt] =leafU(leaf,chunku[vt])
  1103.                         chunkv[vt] =leafV(leaf,chunkv[vt])
  1104.                         VertexTexCoords chunksrf,chunkvi[vt],chunku[vt],chunkv[vt],0,1
  1105.                 Next
  1106. EndIf
  1107.         Next
  1108.  
  1109.         For recv.recv =Each recv
  1110.                 ShowEntity recvid
  1111.         Next
  1112.         CameraZoom lmapscam,1
  1113.         SetBuffer BackBuffer()
  1114.         CameraViewport lmapscam,0,0,GraphicsWidth(),GraphicsHeight()
  1115.         FreeImage tmpImg
  1116. End Function
  1117. Function md#(v1#,v2#,v3#)
  1118.         v1=v1+2000
  1119.         v2=v2+2000
  1120.         v3=v3+2000
  1121.         s#=sm(v1,v2,v3)
  1122.         b#=bg(v1,v2,v3)
  1123.         v#=s+((b-s)/2.)
  1124.         v=v-2000
  1125.         Return v
  1126. End Function
  1127.  
  1128. Function bg#(v1#,v2#,v3#)
  1129.         If v1=v2
  1130.                 If v3<v2 Return v2
  1131.         EndIf
  1132.         If v1=v3
  1133.                 If v2<v1 Return v1
  1134.         EndIf
  1135.         If v2=v3
  1136.                 If v1<v2 Return v2
  1137.         EndIf
  1138.                
  1139.        
  1140.         If v1>v2 And v1>v3 Return v1
  1141.         If v2>v1 And v2>v3 Return v2
  1142.         Return v3
  1143. End Function
  1144.  
  1145. Function sm#(v1#,v2#,v3#)
  1146.         If v1=v2
  1147.                 If v3>v2 Return v1
  1148.         EndIf
  1149.         If v1=v3
  1150.                 If v2>v3 Return v1
  1151.         EndIf
  1152.         If v2=v3
  1153.                 If v1>v2 Return v2
  1154.         EndIf
  1155.        
  1156.        
  1157.         If v1<v2 And v1<v3 Return v1
  1158.         If v2<v1 And v2<v3 Return v2
  1159.         Return v3
  1160. End Function
  1161.  
  1162.  
  1163. Function LightChunks() ;final chunk 'prep' before rendering
  1164. Local miU#,miV#
  1165. Local maU#,maV#,rU#,rV#
  1166. Local u#[3],v#[3]
  1167. Local spiv =CreatePivot(),lpiv1=CreatePivot()
  1168. Local lpiv2 =CreatePivot(),lpiv3 =CreatePivot()
  1169.  
  1170. For chunk.chunk =Each chunk
  1171. If chunklit
  1172.                 ;-fx
  1173.                
  1174.                 ;----
  1175.                 For vt=0 To 2
  1176.                         chunkshim[vt] =Rnd(360)
  1177.                         Select chunkpTex
  1178.                                 Case 1 ;yz
  1179.                                         u[vt] =chunky[vt]
  1180.                                         v[vt] =chunkz[vt]
  1181.                                 Case 2 ;xz
  1182.                                         u[vt] =chunkx[vt]
  1183.                                         v[vt] =chunkz[vt]
  1184.                                 Case 3 ;xy
  1185.                                         u[vt] =chunkx[vt]
  1186.                                         v[vt] =chunky[vt]
  1187.                                 Default
  1188.                                         RuntimeError "Illegal projection plane"
  1189.                         End Select
  1190.                 Next
  1191.                 triNorm( chunkx[0],chunky[0],chunkz[0],chunkx[1],chunky[1],chunkz[1],chunkx[2],chunky[2],chunkz[2])
  1192.                
  1193.                 tnx#=tNormX()
  1194.                 tny#=tnormY()
  1195.                 tnz#=tnormz()
  1196.                
  1197.                 ;map u,v into valid 0,1 range.
  1198.                 miU = 9999
  1199.                 miV = 9999
  1200.                 maU = -9999
  1201.                 maV = -9999
  1202.                 For i=0 To 2
  1203.                         If u[i]<miU
  1204.                                 miU =u[i]
  1205.                         EndIf
  1206.                         If u[i]>maU
  1207.                                 maU =u[i]
  1208.                         EndIf
  1209.                         If v[i]<miV
  1210.                                 miV =v[i]
  1211.                         EndIf
  1212.                         If v[i]>maV
  1213.                                 maV =v[i]
  1214.                         EndIf
  1215.                 Next
  1216.                
  1217.        
  1218.                 rU =maU -miU
  1219.                 rV =maV -miV
  1220.                
  1221.        
  1222.                 mapWidth =chunkcw
  1223.                 mapHeight =chunkch
  1224.        
  1225.                 tempMap =CreateTexture( mapWidth,mapHeight,256)
  1226.                 If Not tempMap Return
  1227.                 For vt=0 To 2
  1228.                         chunku[vt] =(u[vt]-miU) /rU
  1229.                         chunkv[vt] =(v[vt]-miV) /rV
  1230.                 Next
  1231.                
  1232.        
  1233.         dist# = -(chunk
  1234. x * chunkx[0]+chunk
  1235. y*chunky[1]+chunk
  1236. z*chunkz[2])
  1237.                 Select chunkpTex
  1238.                         Case 3
  1239.                        
  1240.                                 Z# = -(chunk
  1241. x*miU + chunk
  1242. y * miV + Dist) / chunk
  1243. z
  1244.                                 uvx# = miu : UVY# = miV : UVZ# = Z
  1245.                                 Z# = -(chunkNX * maU + chunkNY * miV + Dist) / chunkNZ
  1246.                                 V1X# = maU : V1Y# = miV : V1Z# = Z
  1247.                                 Z# = -(chunkNX * miu + chunkNY * maV + Dist) / chunkNZ
  1248.                                 V2X# = miu : V2Y# = maV : V2Z# = Z
  1249.                         Case 2
  1250.                                 Y# = -(chunkNX * miu + chunkNZ * miV + Dist) / chunkNY
  1251.                                 UVX# = miu : UVY# = Y : UVZ# = miV
  1252.                                 Y# = -(chunkNX * maU + chunkNZ * miV + Dist) / chunkNY
  1253.                                 V1X# = maU : V1Y# = Y : V1Z# = miV
  1254.                                 Y# = -(chunkNX * miu + chunkNZ * maV + Dist) / chunkNY
  1255.                                 V2X# = miu : V2Y# = Y : V2Z# = maV
  1256.                         Case 1         
  1257.                                 X# = -(chunkNY * miu + chunkNZ * miV + Dist) / chunkNX
  1258.                                 UVX# = X : UVY# = miu : UVZ# = miV
  1259.                                 X# = -(chunkNY * maU + chunkNZ * miV + Dist) / chunkNX 
  1260.                                 V1X# = X : V1Y# = maU : V1Z# = miV     
  1261.                                 X# = -(chunkNY * miu + chunkNZ * maV + Dist) / chunkNX
  1262.                                 V2X# = X : V2Y# = miu : V2Z# = maV
  1263.                 End Select
  1264.                 chunkeux = V1X - UVX : chunkeuy = V1Y - UVY : chunkeuz = V1Z - UVZ
  1265.                 chunkevx = V2X - UVX : chunkevy = V2Y - UVY : chunkevz = V2Z - UVZ
  1266.                 chunkox = UVX# : chunkoy = UVY# : chunkoz = UVZ#
  1267.  
  1268.        
  1269.                        
  1270.        
  1271.        
  1272.                 If mapWidth<>laW Or mapHeight<>laH
  1273.                         laW =mapWidth
  1274.                         laH =mapHeight
  1275.                         If tmpImg FreeImage tmpImg
  1276.                         tmpImg =CreateImage(mapWidth,mapHeight)
  1277.                         tmpBuf =ImageBuffer(tmpImg)
  1278.                         SetBuffer tmpBuf
  1279.                 EndIf
  1280.                 LockBuffer
  1281.                 LockBuffer TextureBuffer(vest)
  1282.                 vb=TextureBuffer(vest)
  1283.                 For x#=0 To mapWidth-1
  1284.                         au# = x/mapwidth
  1285.                         N_UEdgeX# = chunkEuX * au#  :  N_UEdgeY# = chunkeuY * au#  :  N_UEdgeZ# = chunkeuZ * au#
  1286.                 For y#=0 To mapHeight-1
  1287.                         av# = y/mapHeight              
  1288.                         N_VEdgeX# = chunkevX * av#  :  N_VEdgeY# = chunkevY * av#  :  N_VEdgeZ# = chunkevZ * av#
  1289.                         lx# = (chunkox + N_UEdgeX + N_VEdgeX)
  1290.                         ly# = (chunkoy + N_UEdgeY + N_VEdgeY)
  1291.                         lz# = (chunkoz + N_UEdgeZ + N_VEdgeZ)
  1292.                        
  1293.                         shaded =False
  1294.                         lcast.cast=Null
  1295.                         r1=0
  1296.                         g1=0
  1297.                         b1=0
  1298.        
  1299.                         For light.light =Each light
  1300.                                 PositionEntity lmapscam,lightx,lighty,lightz
  1301.                                 shaded=False
  1302.                                 If lightsc
  1303.                                 For j=0 To lightsc-1
  1304.                                         shade.shadeMap =lightshade[j]
  1305.                                         PointEntity lmapscam,shadecastid
  1306.                                         If shadecastid =chunkmesh Goto skips
  1307.                                         CameraProject lmapscam,lx,ly,lz
  1308.                                         px =ProjectedX()
  1309.                                         If px>0 And px<shadeWidth
  1310.                                         If shadex[px]<>Null
  1311.                                                 py =ProjectedY()
  1312.                                                 If py>0 And py<shadeHeight
  1313.                                                         shaded =shadex[px]y[py]
  1314.                                                         If shaded Exit
  1315.                                                 EndIf
  1316.                                         EndIf
  1317.                                         EndIf
  1318.                                         .skips
  1319.                                 Next
  1320.                                 EndIf
  1321.                                 If Not shaded
  1322.                                         PositionEntity lpiv1,lx,ly,lz
  1323.                                         PositionEntity spiv,lightx,lighty,lightz
  1324.                                         ed# =(EntityDistance(spiv,lpiv1)*lightfallOff)
  1325.                                        
  1326.                                         r1=(light
  1327. -ed)
  1328.                                         g1=(lightg-ed)
  1329.                                         b1=(light-ed)
  1330.                                         If r1<0 r1=0
  1331.                                         If g1<0 g1=0
  1332.                                         If b1<0 b1=0
  1333.                                         rv=rv+r1
  1334.                                         gv=gv+g1
  1335.                                         bv=bv+b1
  1336.                                 Else
  1337.                                
  1338.                                 EndIf
  1339.                         Next
  1340.                         If rv>255 rv=255
  1341.                         If gv>255 gv=255
  1342.                         If bv>255 bv=255
  1343.                         ;If r1<0 rv=0
  1344.                         ;If g1<0 gv=0
  1345.                         ;If b1<0 bv=0          
  1346.                        
  1347.                         rv=128+(128*tnx)
  1348.                         gv=128+(128*tny)
  1349.                         bv=128+(128*tnz)
  1350.                        
  1351.                         WritePixelFast x,y,bv Or (gv Shl 8) Or (rv Shl 16)
  1352.                         rv=0
  1353.                         gv=0
  1354.                         bv=0
  1355.                 Next
  1356.                 Next
  1357.                 UnlockBuffer TextureBuffer(vest)
  1358.                 UnlockBuffer
  1359.                 SetBuffer TextureBuffer(tempMap)
  1360.                 DrawBlock tmpImg,0,0
  1361.                 SetBuffer tmpBuf        
  1362.         ;CopyRect 0,0,mapWidth,mapHeight,0,0,tmpBuf,TextureBuffer(tempMap)
  1363.                
  1364.  
  1365.        
  1366.                
  1367.  
  1368.                
  1369.                 ;-
  1370.                 leaf.leaf =newLeaf(tempMap)
  1371.                 chunkleaf =leaf
  1372.                 FreeTexture tempMap
  1373.                 For vt=0 To 2 ;map lightmap onto mesh
  1374.                         chunku[vt] =leafU(leaf,chunku[vt])
  1375.                         chunkv[vt] =leafV(leaf,chunkv[vt])
  1376.                         VertexTexCoords chunksrf,chunkvi[vt],chunku[vt],chunkv[vt],0,1
  1377.                 Next
  1378. EndIf
  1379.         Next
  1380.  
  1381.         For recv.recv =Each recv
  1382.                 ShowEntity recvid
  1383.         Next
  1384.         CameraZoom lmapscam,1
  1385.         SetBuffer BackBuffer()
  1386.         CameraViewport lmapscam,0,0,GraphicsWidth(),GraphicsHeight()
  1387.         FreeImage tmpImg
  1388. End Function
  1389.  
  1390. Function TFormVector2(Ax#,Ay#,Az#,Bx#,By#,Bz#)
  1391. temp=CreatePivot()
  1392. AlignToVector temp,bx,0,0,1
  1393. AlignToVector temp,0,by,0,2
  1394. AlignToVector temp,0,0,bz,3
  1395. TFormVector ax,ay,az,0,temp
  1396. FreeEntity temp
  1397. End Function
  1398.  
  1399. Function max3#(a#,b#,c#)
  1400.         If a>b
  1401.                 If a>c Return a
  1402.                 Return c
  1403.         EndIf
  1404.         If b>c Return b
  1405.         Return c
  1406. End Function
  1407. Function min3#(a#,b#,c#)
  1408.         If a<b
  1409.                 If a<c Return a
  1410.                 Return c
  1411.         EndIf
  1412.         If b<c Return b
  1413.         Return c
  1414. End Function
  1415.  
  1416.  
  1417. Function texToImage(texture) ;converts a texture to an image
  1418.         out =CreateImage(TextureWidth(texture),TextureHeight(texture))
  1419.         CopyRect 0,0,TextureWidth(texture),TextureHeight(texture),0,0,TextureBuffer(texture),ImageBuffer(out)
  1420.         Return out
  1421. End Function
  1422.  
  1423.  
  1424. ;-- 3rd party functions.
  1425.  
  1426. Function dot(x0#,y0#,x1#,y1#,x2#,y2#)
  1427.  
  1428. Return (x1#-x0#)*(y2#-y1#)-(x2#-x1#)*(y1#-y0#)
  1429.  
  1430. End Function
  1431.  
  1432. Function inTri(px#,py#,x0#,y0#,x1#,y1#,x2#,y2#)
  1433.  
  1434. If dot(x0,y0,x1,y1,px,py)>=0
  1435.  
  1436. If dot(x1,y1,x2,y2,px,py)>=0
  1437.  
  1438. If dot(x2,y2,x0,y0,px,py)>=0
  1439.  
  1440. Return True
  1441.  
  1442. EndIf
  1443.  
  1444. EndIf
  1445.  
  1446. EndIf
  1447.  
  1448. End Function
  1449.  
  1450.  
  1451. Global g_TriNormalX#, g_TriNormalY#, g_TriNormalZ#
  1452.  
  1453. Function TriNorm(x1#, y1#, z1#, x2#, y2#, z2#, x3#, y3#, z3#)
  1454.     ux# = x1# - x2#
  1455.     uy# = y1# - y2#
  1456.     uz# = z1# - z2#
  1457.     vx# = x3# - x2#
  1458.     vy# = y3# - y2#
  1459.     vz# = z3# - z2#    
  1460.         nx# = (uy# * vz#) - (vy# * uz#)
  1461.     ny# = (uz# * vx#) - (vz# * ux#)  
  1462.     nz# = (ux# * vy#) - (vx# * uy#)
  1463. ; Normalize it
  1464.     NormLen# = Sqr((nx*nx) + (ny*ny) + (nz*nz))  
  1465.     If NormLen > 0
  1466.                 nx = nx/NormLen : ny = ny/NormLen: nz = nz/NormLen
  1467.         Else
  1468.                 nx = 0 : ny = 0 : nz = 1
  1469.         EndIf
  1470.         g_TriNormalX = nx
  1471.         g_TriNormalY = ny
  1472.         g_TriNormalZ = nz
  1473. End Function
  1474. Dim txv#(3)
  1475. Type TRIS
  1476. Field x0#
  1477. Field y0#
  1478. Field z0#
  1479. Field u0#
  1480. Field v0#
  1481. Field U20#
  1482. Field V20#
  1483.  
  1484. Field x1#
  1485. Field y1#
  1486. Field z1#
  1487. Field u1#
  1488. Field v1#
  1489. Field U21#
  1490. Field V21#
  1491.  
  1492. Field x2#
  1493. Field y2#
  1494. Field z2#
  1495. Field u2#
  1496. Field v2#
  1497. Field U22#
  1498. Field V22#
  1499.  
  1500. Field surface
  1501. End Type
  1502.  
  1503. Function Weld(mish)
  1504. Dim txv(3)
  1505.  
  1506.  
  1507. For nsurf = 1 To CountSurfaces(mish)
  1508. su=GetSurface(mish,nsurf)
  1509. For tq = 0 To CountTriangles(su)-1
  1510. txv(0) = TriangleVertex(su,tq,0)
  1511. txv(1) = TriangleVertex(su,tq,1)
  1512. txv(2) = TriangleVertex(su,tq,2)
  1513. vq.TRIS = New TRIS
  1514.  
  1515. vqx0# = VertexX(su,txv(0))
  1516. vqy0# = VertexY(su,txv(0))
  1517. vqz0# = VertexZ(su,txv(0))
  1518. vqu0# = VertexU(su,txv(0),0)
  1519. vqv0# = VertexV(su,txv(0),0)
  1520. vqu20# = VertexU(su,txv(0),1)
  1521. vqv20# = VertexV(su,txv(0),1)
  1522.  
  1523. vqx1# = VertexX(su,txv(1))
  1524. vqy1# = VertexY(su,txv(1))
  1525. vqz1# = VertexZ(su,txv(1))
  1526. vqu1# = VertexU(su,txv(1),0)
  1527. vqv1# = VertexV(su,txv(1),0)
  1528. vqu21# = VertexU(su,txv(1),1)
  1529. vqv21# = VertexV(su,txv(1),1)
  1530.  
  1531. vqx2# = VertexX(su,txv(2))
  1532. vqy2# = VertexY(su,txv(2))
  1533. vqz2# = VertexZ(su,txv(2))
  1534. vqu2# = VertexU(su,txv(2),0)
  1535. vqv2# = VertexV(su,txv(2),0)
  1536. vqu22# = VertexU(su,txv(2),1)
  1537. vqv22# = VertexV(su,txv(2),1)
  1538. Next
  1539.  
  1540. ClearSurface su
  1541.  
  1542. For vq.tris = Each tris
  1543.  
  1544. vt1=findvert(su,vqx0#,vqy0#,vqz0#,vqu0#,vqv0#,vqu20#,vqv20#)
  1545.  
  1546. If vt1=-1 Then
  1547. vt1=AddVertex(su,vqx0#,vqy0#,vqz0#,vqu0#,vqv0#)
  1548. VertexTexCoords su,mycount,vqu20#,vqv20#,0,1
  1549. vt1 = mycount
  1550. mycount = mycount +1
  1551. EndIf
  1552.  
  1553. vt2=findvert(su,vqx1#,vqy1#,vqz1#,vqu1#,vqv1#,vqu21#,vqv21#)
  1554. If Vt2=-1 Then
  1555. vt2=AddVertex( su,vqx1#,vqy1#,vqz1#,vqu1#,vqv1#)
  1556. VertexTexCoords su,mycount,vqu21#,vqv21#,0,1
  1557. vt2 = mycount
  1558. mycount = mycount +1
  1559. EndIf
  1560.  
  1561. vt3=findvert(su,vqx2#,vqy2#,vqz2#,vqu2#,vqv2#,vqu22#,vqv22#)
  1562.  
  1563. If vt3=-1 Then
  1564. vt3=AddVertex(su,vqx2#,vqy2#,vqz2#,vqu2#,vqv2#)
  1565. VertexTexCoords su,mycount,vqu22#,vqv22#,0,1
  1566. vt3 = mycount
  1567. mycount = mycount +1
  1568. EndIf
  1569.  
  1570. AddTriangle su,vt1,vt2,vt3
  1571.  
  1572. Next
  1573.  
  1574. Delete Each tris
  1575. mycount=0
  1576. Next
  1577. End Function
  1578.  
  1579. Function findvert(su,x2#,y2#,z2#,u2#,v2#,u22#,v22#)
  1580. Local thresh# =0.001
  1581.  
  1582. For t=0 To CountVertices(su)-1
  1583. If Abs(VertexX(su,t)-x2#)<thresh# Then
  1584. If Abs(VertexY(su,t)-y2#)<thresh# Then
  1585. If Abs(VertexZ(su,t)-z2#)<thresh# Then
  1586. If Abs(VertexU(su,t,0)-u2#)<thresh# Then
  1587. If Abs(VertexV(su,t,0)-v2#)<thresh# Then
  1588. If Abs(VertexU(su,t,1)-u22#)<thresh# Then
  1589. If Abs(VertexV(su,t,1)-v22#)<thresh# Then
  1590. Return t
  1591. EndIf
  1592. EndIf
  1593. EndIf
  1594. EndIf
  1595. EndIf
  1596. EndIf
  1597. EndIf
  1598. Next
  1599. Return -1
  1600. End Function
  1601.  
  1602. Function debugMeshUV( mesh)
  1603.         srf =GetSurface(mesh,1)
  1604.  
  1605.                 For v=0 To CountVertices(srf)-2
  1606.                         DebugLog "U1>"+VertexU(srf,v,0)
  1607.                         DebugLog "U2>"+VertexU(srf,v,0)
  1608.                         DebugLog "V1>"+VertexV(srf,v,0)
  1609.                         DebugLog "V2>"+VertexV(srf,v,0)
  1610.                         VertexTexCoords srf,v,Rnd(0.3),Rnd(0.3)
  1611.                 Next
  1612.  
  1613.  
  1614.        
  1615. End Function
  1616.  
  1617.  
  1618. Function debugLeafs(doLog=True)
  1619. If doLog=4
  1620.         For leaf.leaf =Each leaf
  1621.                 DebugLog "=-=-=-=-=-=-=-=-=-=-"
  1622.                 If leafon
  1623.                         DebugLog "Active leaf"
  1624.                 EndIf
  1625.                 DebugLog "X:"+leafx+" Y:"+leafy+" W:"+leafw+" H:"+leafh
  1626.         Next
  1627. EndIf
  1628.         ;Return
  1629.         If Not MouseDown(1) Return
  1630.         For leaf.leaf =Each leaf
  1631.                 Color 128,128,128
  1632.                 Rect leafx,leafy,leafw,leafh
  1633.                 Color 255,255,255
  1634.                 Rect leafx,leafy,leafw,leafh,0
  1635.         Next
  1636. End Function
  1637.  
  1638.  
  1639. Function Unweld(mesh)
  1640. ;Unweld a mesh, retaining all of its textures coords and textures
  1641. For surfcount = 1 To CountSurfaces(mesh)
  1642. surf = GetSurface(mesh,surfcount)
  1643.  
  1644. count = CountTriangles(surf)
  1645. bank = CreateBank((15*count)*4)
  1646. For tricount = 0 To count-1
  1647. off = (tricount*15)*4
  1648. in = TriangleVertex(surf,tricount,0)
  1649. x# = VertexX(surf,in):y#=VertexY(surf,in):z#=VertexZ(surf,in)
  1650. u# = VertexU(surf,in):v#=VertexV(surf,in)
  1651. PokeFloat(bank,off,x)
  1652. PokeFloat(bank,off+4,y)
  1653. PokeFloat(bank,off+8,z)
  1654. PokeFloat(bank,off+12,u)
  1655. PokeFloat(bank,off+16,v)
  1656.  
  1657. in = TriangleVertex(surf,tricount,1)
  1658. x# = VertexX(surf,in):y#=VertexY(surf,in):z#=VertexZ(surf,in)
  1659. u# = VertexU(surf,in):v#=VertexV(surf,in)
  1660. PokeFloat(bank,off+20,x)
  1661. PokeFloat(bank,off+24,y)
  1662. PokeFloat(bank,off+28,z)
  1663. PokeFloat(bank,off+32,u)
  1664. PokeFloat(bank,off+36,v)
  1665.  
  1666. in = TriangleVertex(surf,tricount,2)
  1667. x# = VertexX(surf,in):y#=VertexY(surf,in):z#=VertexZ(surf,in)
  1668. u# = VertexU(surf,in):v#=VertexV(surf,in)
  1669. PokeFloat(bank,off+40,x)
  1670. PokeFloat(bank,off+44,y)
  1671. PokeFloat(bank,off+48,z)
  1672. PokeFloat(bank,off+52,u)
  1673. PokeFloat(bank,off+56,v)
  1674. Next
  1675.  
  1676. ClearSurface(surf,True,True)
  1677.  
  1678. For tricount = 0 To count-1
  1679. off = (tricount*15)*4
  1680. x# = PeekFloat(bank,off)
  1681. y# = PeekFloat(bank,off+4)
  1682. z# = PeekFloat(bank,off+8)
  1683. u# = PeekFloat(bank,off+12)
  1684. v# = PeekFloat(bank,off+16)
  1685. a = AddVertex(surf,x,y,z,u,v)
  1686. x# = PeekFloat(bank,off+20)
  1687. y# = PeekFloat(bank,off+24)
  1688. z# = PeekFloat(bank,off+28)
  1689. u# = PeekFloat(bank,off+32)
  1690. v# = PeekFloat(bank,off+36)
  1691. b = AddVertex(surf,x,y,z,u,v)
  1692. x# = PeekFloat(bank,off+40)
  1693. y# = PeekFloat(bank,off+44)
  1694. z# = PeekFloat(bank,off+48)
  1695. u# = PeekFloat(bank,off+52)
  1696. v# = PeekFloat(bank,off+56)
  1697. c = AddVertex(surf,x,y,z,u,v)
  1698. AddTriangle(surf,a,b,c)
  1699. Next
  1700. FreeBank bank
  1701.  
  1702. Next
  1703. ;UpdateNormals mesh
  1704.  
  1705.  
  1706. Return mesh
  1707. End Function
  1708.  
  1709. Function TNormX#()
  1710.         Return g_TriNormalX
  1711. End Function
  1712. Function TNormY#()
  1713.         Return g_TriNormalY
  1714. End Function
  1715. Function TNormZ#()
  1716.         Return g_TriNormalZ
  1717. End Function
  1718.  
  1719. ; Load in animation sequences
  1720. ;Idle=ExtractAnimSeq(gsg9,100,159)
  1721. ;Run=ExtractAnimSeq(gsg9,2,37)
  1722. ;Jump=ExtractAnimSeq(gsg9,38,99)
  1723. ;Crouch=ExtractAnimSeq(gsg9,161,190)
  1724. ;CrouchWalk=ExtractAnimSeq(gsg9,192,220)
  1725.  
  1726.  
  1727.  
  1728.  
  1729. ; PickedU(), PickedV(), PickedW() commands
  1730. ;
  1731. ; Created by Mikkel Fredborg
  1732. ;
  1733. ; Use as you please, but please include a thank you :)
  1734. ;
  1735.  
  1736. ;
  1737. ; PickedTri type
  1738. ; Necessary for the PickedU(), PickedV(), and PickedW() commands
  1739. Type PickedTri
  1740. Field ent,surf,tri;picked entity, surface and triangle
  1741. Field px#,py#,pz#    ;picked xyz
  1742. Field pu#[1],  pv#[1]  ,pw#[1]  ;picked uvw x 2
  1743.  
  1744. Field vx#[2],  vy#[2]  ,vz#[2]  ;vertex xyz
  1745. Field vnx#[2], vny#[2] ,vnz#[2] ;vertex normals
  1746. Field vu#[5],  vv#[5]  ,vw#[5]  ;vertex uvw x 2
  1747. End Type
  1748.  
  1749.  
  1750.  
  1751. ;
  1752. ; Returns the Texture U coordinate of the last successful pick command
  1753. ; coordset may be set to either 0 or 1
  1754. Function PickedU#(coordset = 0)
  1755.  
  1756. ; if something new has been picked then calculate the new uvw coordinates
  1757.  
  1758.  
  1759. Return ptripu[coordset]
  1760.  
  1761. End Function
  1762.  
  1763. ;
  1764. ; Returns the Texture U coordinate of the last successful pick command
  1765. ; coordset may be set to either 0 or 1
  1766. Function PickedV#(coordset = 0)
  1767.  
  1768. ; if something new has been picked then calculate the new uvw coordinates
  1769.  
  1770. Return ptripv[coordset]
  1771.  
  1772. End Function
  1773.  
  1774. ;
  1775. ; Returns the Texture U coordinate of the last successful pick command
  1776. ; coordset may be set to either 0 or 1
  1777. Function PickedW#(coordset = 0)
  1778.  
  1779. ; if something new has been picked then calculate the new uvw coordinates
  1780.  
  1781.  
  1782. Return ptripw[coordset]
  1783.  
  1784. End Function
  1785.  
  1786. ;
  1787. ; Calculates the UVW coordinates of a pick
  1788. ; Do not call this by yourself, as PickedU(), PickedV(), and PickedW()
  1789. ; takes care of calling it when nescessary
  1790. Function PickedUVW(ent,surf,tri,x#,y#,z#,nx#,ny#,nz#)
  1791.  
  1792. If surf
  1793. ptrient  = ent
  1794. ptrisurf = surf
  1795. ptri    ri  = tri
  1796.  
  1797.  
  1798. ptripx = x
  1799. ptripy = y
  1800. ptripz = z
  1801.  
  1802. For i = 0 To 2
  1803. TFormPoint VertexX(ptrisurf,TriangleVertex(ptrisurf,ptri        ri,i)),VertexY(ptrisurf,TriangleVertex(ptrisurf,ptri    ri,i)),VertexZ(ptrisurf,TriangleVertex(ptrisurf,ptri    ri,i)),ptrient,0
  1804.  
  1805. ptrivx[i] = TFormedX()
  1806. ptrivy[i] = TFormedY()
  1807. ptrivz[i] = TFormedZ()
  1808.  
  1809. ptrivnx[i] = VertexNX(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i))
  1810. ptrivny[i] = VertexNY(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i))
  1811. ptrivnz[i] = VertexNZ(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i))
  1812.  
  1813. ptrivu[i+0] = VertexU(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),0)
  1814. ptrivv[i+0] = VertexV(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),0)
  1815. ptrivw[i+0] = VertexW(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),0)
  1816.  
  1817. ptrivu[i+3] = VertexU(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),1)
  1818. ptrivv[i+3] = VertexV(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),1)
  1819. ptrivw[i+3] = VertexW(ptrisurf,TriangleVertex(ptrisurf,ptri     ri,i),1)
  1820. Next
  1821.  
  1822. ; Select which component of xyz coordinates to ignore
  1823. Local coords = 3
  1824.  
  1825. If Abs(NX) > Abs(NY)
  1826. If Abs(NX)>Abs(NZ) Then coords = 1
  1827. Else
  1828. If Abs(NY)>Abs(NZ) Then coords = 2
  1829. EndIf
  1830.  
  1831. Local a0#,a1#,b0#,b1#,c0#,c1#
  1832.  
  1833. ; xy components
  1834. If (coords = 3)
  1835. ; edge 0
  1836. a0# = ptrivx[1] - ptrivx[0]
  1837. a1# = ptrivy[1] - ptrivy[0]
  1838.  
  1839. ; edge 1
  1840. b0# = ptrivx[2] - ptrivx[0]
  1841. b1# = ptrivy[2] - ptrivy[0]
  1842.  
  1843. ; picked offset from triangle vertex 0
  1844. c0# =ptripx - ptrivx[0]
  1845. c1# = ptripy - ptrivy[0]
  1846. Else
  1847. ; xz components
  1848. If (coords = 2)
  1849. ; edge 0
  1850. a0# = ptrivx[1] - ptrivx[0]
  1851. a1# = ptrivz[1] - ptrivz[0]
  1852.  
  1853. ; edge 1
  1854. b0# = ptrivx[2] - ptrivx[0]
  1855. b1# = ptrivz[2] - ptrivz[0]
  1856.  
  1857. ; picked offset from triangle vertex 0
  1858. c0# = ptripx - ptrivx[0]
  1859. c1# = ptripz - ptrivz[0]
  1860. Else
  1861. ; yz components
  1862.  
  1863. ; edge 0
  1864. a0# = ptrivy[1] - ptrivy[0]
  1865. a1# = ptrivz[1] - ptrivz[0]
  1866.  
  1867. ; edge 1
  1868. b0# = ptrivy[2] - ptrivy[0]
  1869. b1# = ptrivz[2] - ptrivz[0]
  1870.  
  1871. ; picked offset from triangle vertex 0
  1872. c0# = ptripy - ptrivy[0]
  1873. c1# = ptripz - ptrivz[0]
  1874. End If
  1875. End If
  1876.  
  1877. ;
  1878. ; u and v are offsets from vertex 0 along edge 0 and edge 1
  1879. ; using these it is possible to calculate the Texture UVW coordinates
  1880. ; of the picked XYZ location
  1881. ;
  1882. ; a0*u + b0*v = c0
  1883. ; a1*u + b1*v = c1
  1884. ;
  1885. ; solve equation (standard equation with 2 unknown quantities)
  1886. ; check a math book to see why the following is true
  1887. ;
  1888. Local u# = (c0*b1 - b0*c1) / (a0*b1 - b0*a1)
  1889. Local v# = (a0*c1 - c0*a1) / (a0*b1 - b0*a1)
  1890.  
  1891. ; If either u or v is out of range then the
  1892. ; picked entity was not a mesh, and therefore
  1893. ; the uvw coordinates cannot be calculated
  1894. If (u<0.0 Or u>1.0) Or (v<0.0 Or v>1.0)
  1895. Return
  1896. End If
  1897.  
  1898. ; Calculate picked uvw's for coordset 0 (and modulate them to be in the range of 0-1 nescessary)
  1899. ptripu[0] = (ptrivu[0] + ((ptrivu[1] - ptrivu[0]) * u) + ((ptrivu[2] - ptrivu[0]) * v)) Mod 1
  1900. ptripv[0] = (ptrivv[0] + ((ptrivv[1] - ptrivv[0]) * u) + ((ptrivv[2] - ptrivv[0]) * v)) Mod 1
  1901. ptripw[0] = (ptrivw[0] + ((ptrivw[1] - ptrivw[0]) * u) + ((ptrivw[2] - ptrivw[0]) * v)) Mod 1
  1902.  
  1903. ; If any of the coords are negative
  1904. If ptripu[0]<0.0 Then ptripu[0] = 1.0 + ptripu[0]
  1905. If ptripv[0]<0.0 Then ptripv[0] = 1.0 + ptripv[0]
  1906. If ptripw[0]<0.0 Then ptripw[0] = 1.0 + ptripw[0]
  1907.  
  1908. ; Calculate picked uvw's for coordset 1 (and modulate them to be in the range of 0-1 nescessary)
  1909. ptripu[1] = (ptrivu[3] + ((ptrivu[4] - ptrivu[3]) * u) + ((ptrivu[5] - ptrivu[3]) * v)) Mod 1
  1910. ptripv[1] = (ptrivv[3] + ((ptrivv[4] - ptrivv[3]) * u) + ((ptrivv[5] - ptrivv[3]) * v)) Mod 1
  1911. ptripw[1] = (ptrivw[3] + ((ptrivw[4] - ptrivw[3]) * u) + ((ptrivw[5] - ptrivw[3]) * v)) Mod 1
  1912.  
  1913. ; If any of the coords are negative
  1914. If ptripu[1]<0.0 Then ptripu[1] = 1.0 + ptripu[1]
  1915. If ptripv[1]<0.0 Then ptripv[1] = 1.0 + ptripv[1]
  1916. If ptripw[1]<0.0 Then ptripw[1] = 1.0 + ptripw[1]
  1917. End If
  1918.  
  1919. End Function
  1920.  
  1921.  
  1922.  
  1923.  
  1924. ;


Comments :


Olive(Posted 1+ years ago)

 Impressive work !I'll try it asap, thanks for sharing.


Damien Sturdy(Posted 1+ years ago)

 get rid of the read only attribs ;)otherwise this is cool :D


AntonyWells(Posted 1+ years ago)

 <div class="quote"> get rid of the read only attribs ;) </div>Now, you're either implying I only read replies without actually replying myself, or you're telling me the source can't be altered in your editor, or you're joking 'cos you can't edit the html display. ;pHelp me to help you. :)


AntonyWells(Posted 1+ years ago)

 dp


jfk EO-11110(Posted 1+ years ago)

 I say too: impressive work. No idea about that read-only thing. Anyway. This may be a true alternative to all shadowing and lightmapping stuff we've seen so far.


AntonyWells(Posted 1+ years ago)

 Thanks Jfk. I plan on doing a uber new version for vivid at some point, so it's nice to know it's not unadulterated crap in everyone elses eyes ;)(My first lightmapper is all)


Damien Sturdy(Posted 1+ years ago)

 Heh, sorry, reading my above post i have no idea what i was going on about, though it might have been a problem with the contents of the ZIP file.. :)


Megalomanic(Posted 1+ years ago)

 Where is the ZIP file? Does anyone have the resources?


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal