Woah, that's all way over my head.. Maybe I should just use a sin/cosine/tan equation to create what I'm looking for.
Then again, this linepick does sound interesting, so I tried what Stevie suggested, here's an external-less media code of what I'm ussing. It was in the water competition awhile back but a little different since I started toying with it. btw props to fredborg for create code.
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
;
; Prepare stuff
Cube_Init()
;
; Make a camera
Global camera=CreateCamera()
CameraClsMode camera,False,True
CameraRange camera,1,10000
CameraFogColor camera,96,140,183
CameraFogRange camera,2000,9000
CameraFogMode camera,1
;
; Make a stunning light
light=CreateLight()
RotateEntity light,25,0,0
AmbientLight 100,105,120
;
; Make a pivot which the camera points at
center=CreatePivot()
;
; Make a sky sphere
;skytex = LoadTexture("sky.png",1+8+16+32)
;sky = CreateSphere(16)
;FlipMesh sky
;ScaleEntity sky,5000,5000,5000
;EntityOrder sky,1000
;EntityFX sky,1+16
;EntityTexture sky,skytex
;
; A duck
duck=CreateCube("")
ScaleEntity duck,1000,1000,1000
;
; Some great variables
size# = 128*50.0
a#=180
storm# = 2.5
height# = 13.0
crystal# = 0.6
Animat = True
cubeupd = True
help = True
;
; And then we are ready
While KeyDown(1)=0
sx# = MouseXSpeed()
sy# = MouseYSpeed()
a2# = (a2+.01) Mod 360
;
; Animate camera or control it with mouse + keys
If animat
a#=(a+.1) Mod 360
PositionEntity camera, Sin(a)*(.5*size),500+(Sin(a)*400),Cos(a)*(.5*size)
PointEntity camera, center
Else
TurnEntity camera,sy,-sx,0
RotateEntity camera,EntityPitch(camera,True),EntityYaw(camera,True),0
MoveEntity camera,(KeyDown(32)-KeyDown(30))*10,0,(KeyDown(17)-KeyDown(31))*10
EndIf
;
; Move the duck
;
; Change fog if below water level
If EntityY(camera,True)<0
CameraFogColor camera,50,90,100
CameraFogRange camera,500,3000
Else
CameraFogColor camera,96,140,183
CameraFogRange camera,2000,9000
EndIf
;
; Reposition sky
;PositionEntity sky,EntityX(camera,1),EntityY(camera,1),EntityZ(camera,1),1
;
; Animate the waves
Cube_Waves(camera,storm,height,crystal)
;
; Update reflection?
;If cubeupd
; Cube_Update(camera,sky)
;EndIf
RenderWorld()
;
; Fps counter
curTime = MilliSecs()
If curTime > checkTime Then
checkTime = curTime + 1000
curFPS = fpscounter
fpscounter = 0
If currentFrame>75
If curFPS<fps_low Then fps_low = curFPS
EndIf
Else
fpscounter = fpscounter + 1
End If
Flip False
Wend
;
; We're done!
End
;
; Water
;
; By Mikkel Fredborg
; Use as you please!
;
; A bunch of global variables
Global cubetex
Global cubetex2
Global cubetex3
Global cubetex4
Global cubetex5
Global cubesize
Global cubereflect
Global cuberefract
Global cubecamA[5]
Global cubewater
Global cubetile[9999]
Global cubewave#
Global cuberes
Global cubescale#
Global cubeoffset#
Global cubebase
Global cubeinfinite
Global cubered#,cubegreen#,cubeblue#
Dim cubewavemap#(16,16,8)
Dim tempwavemap#(16,16,1)
Global slope_x#,slope_y#,slope_z#
Function Cube_Init(res=15,tres=256,soften=0,scale#=1500.0)
cubescale = scale
Dim cubewavemap#(res,res,8)
Dim cubewavemap#(res,res,8)
cubetex2 = CreateTexture(256,256,1+2)
;cubetex2 = LoadTexture("waterfoam00.png",1+2)
cubetex3 = CreateTexture(256,256,1+2)
;cubetex3 = LoadTexture("waterfoam00.png",1+2)
ScaleTexture cubetex2,0.5,0.5
RotateTexture cubetex3,45
ScaleTexture cubetex3,2,2
cubetex4 = CreateTexture(256,256,1+2)
;cubetex4 = LoadTexture("wateralpha00.png",1+2)
cubetex5 = CreateTexture(256,256,1+2)
;cubetex5 = LoadTexture("wateralpha00.png",1+2)
RotateTexture cubetex4,45
ScaleTexture cubetex4,2,2
cubetex = CreateTexture(tres,tres,1 + 128 + 256)
cubesize = TextureWidth(cubetex)
cubereflect = CreatePivot()
HideEntity cubereflect
For i=0 To 5
cubecamA[i] = CreateCamera(cubereflect)
CameraClsMode cubecamA[i],False,True
CameraRange cubecamA[i],1,15000
Next
RotateEntity cubecamA[0],0,90,0 ; right
CameraViewport cubecamA[0],0,0,cubesize,cubesize
RotateEntity cubecamA[1],0,0,0 ; forw
CameraViewport cubecamA[1],cubesize,0,cubesize,cubesize
RotateEntity cubecamA[2],0,-90,0 ; left
CameraViewport cubecamA[2],cubesize*2,0,cubesize,cubesize
RotateEntity cubecamA[3],0,180,0 ; back
CameraViewport cubecamA[3],0,cubesize,cubesize,cubesize
RotateEntity cubecamA[4],-90,0,0 ; up
CameraViewport cubecamA[4],cubesize,cubesize,cubesize,cubesize
RotateEntity cubecamA[5],90,0,0 ; down
CameraViewport cubecamA[5],cubesize*2,cubesize,cubesize,cubesize
cubewater = Cube_CreatePlane(res,True)
ScaleMesh cubewater,scale,1,scale
br1 = CreateBrush()
BrushTexture br1,cubetex4
BrushTexture br1,cubetex5,0,1
BrushTexture br1,cubetex,0,2
BrushFX br1,2+32+16+1
BrushShininess br1,1.0
s1 = GetSurface(cubewater,2)
PaintSurface s1,br1
br2 = CreateBrush()
BrushTexture br2,cubetex2
BrushTexture br2,cubetex3,0,1
BrushFX br2,1+2+32
s2 = GetSurface(cubewater,1)
PaintSurface s2,br2
cubered = 140 ;* 1.2
cubegreen = 180 ;* 1.2
cubeblue = 200 ;* 1.2
br2 = CreateBrush()
BrushFX br2,1+2+32+16
BrushAlpha br2,0.75
tcount = 5
i = 0
For x = -tcount To tcount
For z = -tcount To tcount
If x<>0 Or z<>0
cubetile[i] = CopyEntity(cubewater)
PositionEntity cubetile[i],x*scale,0,z*scale
;d# = Abs(x)
;If Abs(z)>d Then d = Abs(z)
;If d>1
; ScaleEntity cubetile[i],1,1.0-(d/(tcount+0.01)),1
;EndIf
i = i + 1
EndIf
Next
Next
i = 0
For x = -tcount To tcount
For z = -tcount To tcount
If x<>0 Or z<>0
If cubetile[i]
EntityParent cubetile[i],cubewater
EndIf
i = i + 1
EndIf
Next
Next
cubebase = CreatePivot()
mmx# = 0.35
BrushFX br2,1+2+32
pr1 = Cube_CreatePlane(16,False)
EntityParent pr1,cubebase
PaintEntity pr1,br2
;PositionEntity pr1,0,-0.5,0
ScaleEntity pr1,scale*tcount*2,1,scale*tcount*2
EntityOrder pr1,1
surf = GetSurface(pr1,1)
n_verts = CountVertices(surf)-1
For v = 0 To n_verts
vx# = VertexX(surf,v)*2.0
vz# = VertexZ(surf,v)*2.0
d# = Sqr(vx*vx + vz*vz)
a# = 1.0-d
VertexColor surf,v,cubered*mmx,cubegreen*mmx,cubeblue*mmx,a
Next
cuberes = res
For x = 0 To res
For z = 0 To res
cubewavemap(x,z,0) = Rnd(-1.0,1.0)*360.0*(16.0/cuberes)
cubewavemap(x,z,1) = Rnd(-1.0,1.0)
Next
Next
For i = 1 To soften
Cube_BlurWaveMap()
Next
For x = 0 To res
For z = 0 To res
xz# = ((x/Float(res)) - (z/Float(res)));/2.0
cubewavemap(x,z,0) = (xz*360.0) + cubewavemap(x,z,0)
; cubewavemap(x,z,1) = ACos(cubewavemap(x,z,1));+(z*(res/360.0))
i = x
j = z
If i = res Then i = 0
If j = res Then j = 0
cubewavemap(x,z,0) = cubewavemap(i,j,0)
cubewavemap(x,z,1) = cubewavemap(i,j,1)
Next
Next
End Function
Function Cube_BlurWaveMap()
Dim tempwavemap(cuberes,cuberes,1)
For x = 0 To cuberes
For z = 0 To cuberes
For xx = -1 To 1
For zz = -1 To 1
x2 = xx+x
z2 = zz+z
If x2<0 Then x2 = cuberes
If x2>cuberes Then x2 = 0
If z2<0 Then z2 = cuberes
If z2>cuberes Then z2 = 0
tempwavemap(x,z,0) = tempwavemap(x,z,0) + (cubewavemap(x2,z2,0)/9.0)
tempwavemap(x,z,1) = tempwavemap(x,z,1) + (cubewavemap(x2,z2,1)/9.0)
Next
Next
Next
Next
For x = 0 To cuberes
For z = 0 To cuberes
cubewavemap(x,z,0) = tempwavemap(x,z,0)
cubewavemap(x,z,1) = tempwavemap(x,z,1)
Next
Next
End Function
Function Cube_GetHeight#(x#,z#)
x# = (x/cubescale)-0.5
z# = (z/cubescale)-0.5
basex = Floor(x)
basez = Floor(z)
deltax# = x-basex
deltaz# = z-basez
basex = basex Mod cuberes
basey = basey Mod cuberes
If basex<0 Then basex = basex + cuberes
If basez<0 Then basez = basez + cuberes
xy0# = cubewavemap(basex,basez, 1) + (cubewavemap(basex+1,basez ,1)-cubewavemap(basex,basez ,1))*deltax
xy1# = cubewavemap(basex,basez+1,1) + (cubewavemap(basex+1,basez+1,1)-cubewavemap(basex,basez+1,1))*deltax
cY# = xy0 + (xy1-xy0)*deltaz
Return cY
End Function
Function Cube_GetSlope#(x#,z#)
x# = (x/cubescale)-0.5
z# = (z/cubescale)-0.5
basex = Floor(x)
basez = Floor(z)
deltax# = x-basex
deltaz# = z-basez
basex = basex Mod cuberes
basey = basey Mod cuberes
If basex<0 Then basex = basex + cuberes
If basez<0 Then basez = basez + cuberes
xy0# = cubewavemap(basex,basez, 2) + (cubewavemap(basex+1,basez ,2)-cubewavemap(basex,basez ,2))*deltax
xy1# = cubewavemap(basex,basez+1,2) + (cubewavemap(basex+1,basez+1,2)-cubewavemap(basex,basez+1,2))*deltax
slope_x# = xy0 + (xy1-xy0)*deltaz
xy0# = cubewavemap(basex,basez, 3) + (cubewavemap(basex+1,basez ,3)-cubewavemap(basex,basez ,3))*deltax
xy1# = cubewavemap(basex,basez+1,3) + (cubewavemap(basex+1,basez+1,3)-cubewavemap(basex,basez+1,3))*deltax
slope_y# = xy0 + (xy1-xy0)*deltaz
xy0# = cubewavemap(basex,basez, 4) + (cubewavemap(basex+1,basez ,4)-cubewavemap(basex,basez ,4))*deltax
xy1# = cubewavemap(basex,basez+1,4) + (cubewavemap(basex+1,basez+1,4)-cubewavemap(basex,basez+1,4))*deltax
slope_z# = xy0 + (xy1-xy0)*deltaz
Return cY
End Function
Function Cube_Waves(cam,stormy#=0.5,waveheight#=30.0,crystal#=0.9)
;EntityAlpha cubeinfinite,crystal
d# = (MilliSecs()/10000.0)*stormy
PositionTexture cubetex2,d*0.5,d
PositionTexture cubetex3,-d*0.5,-d
PositionTexture cubetex4, d*0.65, d*1.1
PositionTexture cubetex5,-d*0.65,-d*1.1
x#=EntityX(cam,True)
z#=EntityZ(cam,True)
PositionEntity cubebase,x,0,z
px = x/cubescale
pz = z/cubescale
PositionEntity cubewater,px*cubescale,0,pz*cubescale
surf = GetSurface(cubewater,2)
surf2 = GetSurface(cubewater,1)
vert = 0
For x = 0 To cuberes
For z = 0 To cuberes
cubewavemap(x,z,0) = (cubewavemap(x,z,0) + stormy) ;Mod 360
If cubewavemap(x,z,0)<0
cubewavemap(x,z,0) = cubewavemap(x,z,0) + 360.0
ElseIf cubewavemap(x,z,0)=>360.0
cubewavemap(x,z,0) = cubewavemap(x,z,0) - 360.0
EndIf
cubewavemap(x,z,1) = (((Sin(cubewavemap(x,z,0))+1.0)*0.5)) * waveheight#
vert = vert+1
Next
Next
delta# = cubescale/cuberes
For x = 0 To cuberes-1
For z = 0 To cuberes-1
;Edge vector v1-v0
Ax# = 0
Ay# = cubewavemap(x,z+1,1)-cubewavemap(x,z,1)
Az# = delta
;Edge vector v2-v0
Bx# = delta
By# = cubewavemap(x+1,z,1)-cubewavemap(x,z,1)
Bz# = 0
;crossproduct = normal
cubewavemap(x,z,2) = Ay# * Bz# - By# * Az#
cubewavemap(x,z,3) = Az# * Bx# - Bz# * Ax#
cubewavemap(x,z,4) = Ax# * By# - Bx# * Ay#
Next
Next
exa# = 15.0
TFormNormal 0,0,-1,cam,0
nx# = TFormedX()
ny# = TFormedY()
nz# = TFormedZ()
;alp# = 1.0-((EntityY(cam,True)-200.0)/1000.0)
;If alp>1.0 Then alp = 1.0
;If alp<0.0 Then alp = 0.0
alp# = 1.0
If waveheight<20.0
alpmul# = 1.0/20.0
Else
alpmul# = 1.0/waveheight
EndIf
vert = 0
For x = 0 To cuberes
For z = 0 To cuberes
If x<cuberes And z<cuberes
TriNormalX# = 0.0
TriNormalY# = 0.0
TriNormalZ# = 0.0
For xx = -1 To 1
For zz = -1 To 1
x2 = x+xx
z2 = z+zz
If x2<0 Then x2=cuberes-1
If z2<0 Then z2=cuberes-1
TriNormalX = TriNormalX + cubewavemap(x2,z2,2)
TriNormalY = TriNormalY + cubewavemap(x2,z2,3)
TriNormalZ = TriNormalZ + cubewavemap(x2,z2,4)
Next
Next
d# = Sqr(TriNormalX*TriNormalX + TriNormalY*TriNormalY + TriNormalZ*TriNormalZ)
TriNormalX = TriNormalX/d
TriNormalY = TriNormalY/d
TriNormalZ = TriNormalZ/d
VertexCoords surf,vert,VertexX(surf,vert),cubewavemap(x,z,1),VertexZ(surf,vert)
VertexNormal surf,vert,TriNormalX,TriNormalY,TriNormalZ
dot# = (TriNormalY*ny + TriNormalX*exa*nx + TriNormalZ*exa*nz);*0.0001
If dot<0 Then dot = 0
If dot>1 Then dot = 1
;dot = dot*dot
;add# = (VertexY(surf,vert)-waveheight)*2.5
;VertexColor surf,vert,cubered+add,cubegreen+add,cubeblue+add,(crystal-(dot*crystal))*alp
VertexColor surf,vert,255,255,255,(crystal-(dot*crystal))*alp
VertexCoords surf2,vert,VertexX(surf,vert),cubewavemap(x,z,1),VertexZ(surf,vert)
alpha# = cubewavemap(x,z,1)*alpmul
alpha2# = alpha * alpha * alpha
VertexColor surf2,vert,255,255,255,(alp*alpha2*0.5)+0.05
Else
x2 = x
z2 = z
If x2 = cuberes Then x2 = 0
If z2 = cuberes Then z2 = 0
vert2 = x2*(cuberes+1) + z2
VertexCoords surf,vert,VertexX(surf,vert),VertexY(surf,vert2),VertexZ(surf,vert)
VertexColor surf,vert,VertexRed(surf,vert2),VertexGreen(surf,vert2),VertexBlue(surf,vert2),VertexAlpha(surf,vert2)
VertexNormal surf,vert,VertexNX(surf,vert2),VertexNY(surf,vert2),VertexNZ(surf,vert2)
VertexCoords surf2,vert,VertexX(surf2,vert),VertexY(surf,vert2),VertexZ(surf2,vert)
VertexColor surf2,vert,VertexRed(surf2,vert2),VertexGreen(surf2,vert2),VertexBlue(surf2,vert2),VertexAlpha(surf2,vert2)
EndIf
vert = vert+1
Next
Next
;UpdateNormals cubewater
cubewave# = (cubewave#+stormy#) Mod 360
cubeoffset# = (cubeoffset+stormy) Mod cuberes
End Function
Function Cube_Update(camera,sky)
HideEntity cubewater
HideEntity cubebase
HideEntity camera
x#=EntityX(camera,1)
y#=EntityY(cubewater,1)-EntityY(camera,1)
z#=EntityZ(camera,1)
ox# = EntityX(sky,True)
oy# = EntityY(sky,True)
oz# = EntityZ(sky,True)
ShowEntity cubereflect
If y<0
ScaleEntity cubereflect,1,1,1
PositionEntity cubereflect,x,y,z
Else
y = -y
ScaleEntity cubereflect,1,-1,1
PositionEntity cubereflect,x,y,z
EndIf
PositionEntity sky,x,y,z,True
RenderWorld()
SetCubeFace cubetex,0
CopyRect 0,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
SetCubeFace cubetex,1
CopyRect cubesize,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
SetCubeFace cubetex,2
CopyRect cubesize*2,0,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
SetCubeFace cubetex,3
CopyRect 0,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
SetCubeFace cubetex,4
CopyRect cubesize,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
SetCubeFace cubetex,5
CopyRect cubesize*2,cubesize,cubesize,cubesize,0,0,BackBuffer(),TextureBuffer(cubetex)
ShowEntity cubebase
ShowEntity cubewater
HideEntity cubereflect
ShowEntity camera
PositionEntity sky,ox,oy,oz,True
End Function
;Creates a single sided face
;segmented
Function Cube_CreatePlane(segs=1,dual=True,double=False,parent=0,uvscale#=8.0)
mesh=CreateMesh( parent )
surf=CreateSurface( mesh )
If dual
surf2 = CreateSurface( mesh )
EndIf
stx#=-0.5
sty#=stx
stp#=Float(1)/Float(segs)
y#=sty
For a=0 To segs
x#=stx
v#=a/Float(segs)
For b=0 To segs
u#=b/Float(segs)
i = AddVertex(surf,x,0,y,u*uvscale,v*uvscale) ; swap these for a different start orientation
If dual
i = AddVertex(surf2,x,0,y,u*uvscale,v*uvscale)
EndIf
; VertexTexCoords surf,i,u*uvscale,(1.0-v)*uvscale,1.0,1
x=x+stp
Next
y=y+stp
Next
For a=0 To segs-1
For b=0 To segs-1
v0=a*(segs+1)+b:v1=v0+1
v2=(a+1)*(segs+1)+b+1:v3=v2-1
AddTriangle( surf,v0,v2,v1 )
AddTriangle( surf,v0,v3,v2 )
If dual
AddTriangle( surf2,v0,v2,v1 )
AddTriangle( surf2,v0,v3,v2 )
EndIf
Next
Next
UpdateNormals mesh
If double=True Then EntityFX mesh,16
Return mesh
End Function