Sweet, I got it working. To use this in Blitz3D, you need to get the dotproduct of the light vector and the vertex mapping axis for U and V, to determine the vertex red and green colors, respectively.
Just to help, here is a bit of my engine code that calculates the vertex colors:
You would then do something like this:
VertexColor surface,v,vertexdx[v]*128.0+128.0,vertexdy[v]*128.0+128.0
Method BuildMappingAxes() mappingaxeschanged=False mappingaxisarray=CreateBank(vertexarray.size()*2) For t=0 To indicearray.size()/6-1 a=PeekShort(indicearray,t*6+0) b=PeekShort(indicearray,t*6+2) c=PeekShort(indicearray,t*6+4) v1x#=PeekFloat(vertexarray,a*12+0) v1y#=PeekFloat(vertexarray,a*12+4) v1z#=PeekFloat(vertexarray,a*12+8) v2x#=PeekFloat(vertexarray,b*12+0) v2y#=PeekFloat(vertexarray,b*12+4) v2z#=PeekFloat(vertexarray,b*12+8) v3x#=PeekFloat(vertexarray,c*12+0) v3y#=PeekFloat(vertexarray,c*12+4) v3z#=PeekFloat(vertexarray,c*12+8) w1x#=PeekFloat(texcoordarray,a*8+0) w1y#=PeekFloat(texcoordarray,a*8+4) w2x#=PeekFloat(texcoordarray,b*8+0) w2y#=PeekFloat(texcoordarray,b*8+4) w3x#=PeekFloat(texcoordarray,c*8+0) w3y#=PeekFloat(texcoordarray,c*8+4) x1:Float=v2x-v1x x2:Float=v3x-v1x y1:Float=v2y-v1y y2:Float=v3y-v1y z1:Float=v2z-v1z z2:Float=v3z-v1z s1:Float=w2x-w1x s2:Float=w3x-w1x t1:Float=w2y-w1y t2:Float=w3y-w1y r:Float=1.0/(s1*t2-s2*t1) sx:Float=(t2*x1-t1*x2)*r sy:Float=(t2*y1-t1*y2)*r sz:Float=(t2*z1-t1*z2)*r tx:Float=(s1*x2-s2*x1)*r ty:Float=(s1*y2-s2*y1)*r tz:Float=(s1*z2-s2*z1)*r Normalize(sx,sy,sz) sx=VectorX() sy=VectorY() sz=VectorZ() Normalize(tx,ty,tz) tx=VectorX() ty=VectorY() tz=VectorZ() PokeFloat mappingaxisarray,a*24+0,sx PokeFloat mappingaxisarray,a*24+4,sy PokeFloat mappingaxisarray,a*24+8,sz PokeFloat mappingaxisarray,a*24+12,tx PokeFloat mappingaxisarray,a*24+16,ty PokeFloat mappingaxisarray,a*24+20,tz PokeFloat mappingaxisarray,b*24+0,sx PokeFloat mappingaxisarray,b*24+4,sy PokeFloat mappingaxisarray,b*24+8,sz PokeFloat mappingaxisarray,b*24+12,tx PokeFloat mappingaxisarray,b*24+16,ty PokeFloat mappingaxisarray,b*24+20,tz PokeFloat mappingaxisarray,c*24+0,sx PokeFloat mappingaxisarray,c*24+4,sy PokeFloat mappingaxisarray,c*24+8,sz PokeFloat mappingaxisarray,c*24+12,tx PokeFloat mappingaxisarray,c*24+16,ty PokeFloat mappingaxisarray,c*24+20,tz Next EndMethod
Just to help, here is a bit of my engine code that calculates the vertex colors:
Case CLASS_POINTLIGHT 'If lightaffectsface(light,Self) For v=0 To vertexarray.size()/12-1 x#=PeekFloat(vertexarray,v*12+0) y#=PeekFloat(vertexarray,v*12+4) z#=PeekFloat(vertexarray,v*12+8) If pointdistance(lpx,lpy,lpz,x,y,z)<light.range mappingaxisu.x=PeekFloat(mappingaxisarray,v*24+0) mappingaxisu.y=PeekFloat(mappingaxisarray,v*24+4) mappingaxisu.z=PeekFloat(mappingaxisarray,v*24+8) mappingaxisv.x=PeekFloat(mappingaxisarray,v*24+12) mappingaxisv.y=PeekFloat(mappingaxisarray,v*24+16) mappingaxisv.z=PeekFloat(mappingaxisarray,v*24+20) normalize x-lpx,y-lpy,z-lpz lx#=+vectorx() ly#=+vectory() lz#=+vectorz() vertexdx[v]=vertexdx[v]-dotproduct(mappingaxisu.x,mappingaxisu.y,mappingaxisu.z,lx,ly,lz) vertexdy[v]=vertexdy[v]-dotproduct(mappingaxisv.x,mappingaxisv.y,mappingaxisv.z,lx,ly,lz) vertexinfluences[v]=vertexinfluences[v]+1 EndIf Next 'EndIf Case CLASS_SUNLIGHT tformnormal 0,0,1,light,entity lx#=tformedx() ly#=tformedy() lz#=tformedz() For v=0 To vertexarray.size()/12-1 nx#=PeekFloat(normalarray,v*12+0) ny#=PeekFloat(normalarray,v*12+4) nz#=PeekFloat(normalarray,v*12+8) mappingaxisu.x=PeekFloat(mappingaxisarray,v*24+0) mappingaxisu.y=PeekFloat(mappingaxisarray,v*24+4) mappingaxisu.z=PeekFloat(mappingaxisarray,v*24+8) mappingaxisv.x=PeekFloat(mappingaxisarray,v*24+12) mappingaxisv.y=PeekFloat(mappingaxisarray,v*24+16) mappingaxisv.z=PeekFloat(mappingaxisarray,v*24+20) If dotproduct(lx,ly,lz,nx,ny,nz)<0.0 vertexdx[v]=vertexdx[v]-dotproduct(mappingaxisu.x,mappingaxisu.y,mappingaxisu.z,lx,ly,lz) vertexdy[v]=vertexdy[v]-dotproduct(mappingaxisv.x,mappingaxisv.y,mappingaxisv.z,lx,ly,lz) vertexinfluences[v]=vertexinfluences[v]+1 EndIf Next
You would then do something like this:
VertexColor surface,v,vertexdx[v]*128.0+128.0,vertexdy[v]*128.0+128.0