Hi everybody.. iam back :)
Here is a fun problem that iam working on.
1) Create a detailmesh
2) Create a lod mesh
3) Join em together using blitz3d vertexX and vertexY
4) Have a command that Rerender em both. But LOD detail must sustain stable.
Question:
Iam trying to do above. but always run into difirent problems.
What do you all other think.
here is some code iam using.. not working propper (Planing to scrap it)
[CODE]
;Lod experment 2006-12-31 22:16
;********* Treemodels ***************************
Type tree
Field root ;Nunber of root tree usaly 1
Field leaf[128] ;Pointer to branch mesh
Field light[128]
Field leafs
Field anim
End Type
Global tree,t_sprite,t_light
Global t_anim,t_leaf
;***********************************************
;LodVerts 8x
Type lodverts8x
Field vert8x
End Type
;Lodverts 1x
Type lodverts1x
Field vert1x ;Nev vertices på LOD mesh som ska flyttas till detail verts.
Field detailvert ;Den vertices som den joinar på detail meshen
End Type
;Camera thins
Global camera
;Datas.
Dim verts1(64,64) ;Detail mesh
Dim verts2(64,64) ;Lod mesh
Dim verts3(64,2) ;Över kopplings pungt på lod.
Dim verts4(2,64) ;Vänster kopplings punger på lod.
Dim verts5(64,2) ;Nedre kopplings pungt på lod.
Dim verts6(2,64) ;Högre kopplings pungter på lod.
Dim wd#(1025,1025) ; World array height data
Global wx=1024,wz=1024
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()
Cls
camera=CreateCamera()
CameraViewport camera,0,0,1024,768
PositionEntity camera,256,120,256-16
CameraClsColor camera,127,128,255
CameraFogColor camera,127,128,255
CameraFogRange camera,32,250
CameraFogMode camera,1
CameraRange camera,0.1,500
;TurnEntity camera,90,0,0
light=CreateLight()
;------- Detail mesh --------------
mesh=CreateMesh()
surf1=CreateSurface(mesh)
;Skapar pungterna för detail mapen
For x=0 To 64
For z=0 To 64
verts1(x,z)=AddVertex (surf1,x+224,0,z+224,x,z)
Next
Next
;Kopplar polygonerna i meshen
For x=0 To 63
For z=0 To 63
AddTriangle surf1,verts1(x,z),verts1(x,z+1),verts1(x+1,z+1)
AddTriangle surf1,verts1(x,z),verts1(x+1,z+1),verts1(x+1,z)
Next
Next
;---------------------------------
;--------- LOD mesh ------------------
;Skapar LOD mesh som ska kopplas runt detail meshen
lodmesh=CreateMesh()
surf2=CreateSurface(lodmesh)
;Skapar lagret som ska vara Högst upp. Aka 512 till 64
For x=1 To 63
For z=36 To 64
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8,x*8,z*8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 62
For z=36 To 63
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Skapar Kopplings pungt 1 vertikal överts
For x=0 To 64
verts3(x,1)=AddVertex (surf2,x+224,0,1+228+59)
verts3(x,2)=AddVertex (surf2,x+224,0,2+228+66)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts3(x,1)
tmp_v1\detailvert = verts1(x,64)
;***** Debug code ************************
Goto holycraphigh
sphere=CreateSphere()
ScaleEntity sphere,0.2,0.2,0.2
tx=VertexX(surf1,tmp_v1\detailvert)
tz=VertexZ(surf1,tmp_v1\detailvert)
PositionEntity sphere,tx,0,tz
EntityColor sphere,0,255,0
cube=CreateCube()
ScaleEntity cube,0.3,0.3,0.3
tx=VertexX(surf2,tmp_v1\vert1x)
tz=VertexZ(surf2,tmp_v1\vert1x)
PositionEntity cube,tx,0,tz
EntityColor cube,255,0,0
prerender
.holycraphigh
;*****************************************
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts3(x,2)
Next
For x=0 To 63 Step 8
z=1
AddTriangle surf2,verts3(x,z),verts3(x,z+1),verts3(x+1,z)
AddTriangle surf2,verts3(x+1,z),verts3(x,z+1),verts3(x+1+1,z)
AddTriangle surf2,verts3(x+2,z),verts3(x,z+1),verts3(x+1+2,z)
AddTriangle surf2,verts3(x+3,z),verts3(x,z+1),verts3(x+1+3,z)
AddTriangle surf2,verts3(x+4,z),verts3(x+8,z+1),verts3(x+1+4,z)
AddTriangle surf2,verts3(x+5,z),verts3(x+8,z+1),verts3(x+1+5,z)
AddTriangle surf2,verts3(x+6,z),verts3(x+8,z+1),verts3(x+1+6,z)
AddTriangle surf2,verts3(x+7,z),verts3(x+8,z+1),verts3(x+1+7,z)
AddTriangle surf2,verts3(x+4,z),verts3(x,z+1),verts3(x+8,z+1)
;AddTriangle surf2,verts3(x,z),verts3(x+1,z+1),verts3(x+1,z)
Next
;Skapar vänster övere hörn bit
AddTriangle surf2,verts2(27,36),verts2(28,36),verts3(0,1)
;Skapar Höger övre bit
AddTriangle surf2,verts2(36,36),verts2(37,36),verts3(64,1)
;--------------------------------------
;Skapar Resten av Vänster kant
For x=0 To 27
For z=0 To 35
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 26
For z=1 To 35
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Vänster kopplings pungter
For z=0 To 64
x=0
verts4(1,z)=AddVertex (surf2,216,0,z+224)
verts4(2,z)=AddVertex (surf2,224,0,z+224)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts4(1,z)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts4(2,z)
Next
For z=0 To 63 Step 8
x=1
;AddTriangle surf2,verts4(x,z),verts4(x,z+1),verts4(x+1,z+1)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1),verts4(x+1,z)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+1),verts4(x+1,z+1)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+2),verts4(x+1,z+2)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+3),verts4(x+1,z+3)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+4),verts4(x+1,z+4)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+5),verts4(x+1,z+5)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+6),verts4(x+1,z+6)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+7),verts4(x+1,z+7)
AddTriangle surf2,verts4(x,z),verts4(x,z+8),verts4(x+1,z+4)
Next
;Skapar vänster övere bit 2
AddTriangle surf2,verts2(27,36),verts4(2,64),verts2(27,35)
;Skapar resten av nedre lod
;Skapar lagret som ska vara längst ned.
For x=1 To 63
For z=1 To 26
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 62
For z=1 To 25
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Skapar Kopplings pungt 1 vertikal överts
For x=0 To 64
verts5(x,1)=AddVertex (surf2,x+224,0,1+215)
verts5(x,2)=AddVertex (surf2,x+224,0,2+215+7)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts5(x,1)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts5(x,2)
Next
For x=0 To 63 Step 8
z=1
AddTriangle surf2,verts5(x,z),verts5(x,z+1),verts5(x+1,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1+1,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+2,z+1),verts5(x+1+2,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+3,z+1),verts5(x+1+3,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+4,z+1),verts5(x+1+4,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+5,z+1),verts5(x+1+5,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+6,z+1),verts5(x+1+6,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+7,z+1),verts5(x+1+7,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+4,z+1),verts5(x+8,z)
;AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1,z)
Next
;Kopplar höger nedre kopplings hörn
AddTriangle surf2,verts2(27,27),verts4(2,0),verts2(27,26)
AddTriangle surf2,verts2(27,26),verts4(2,0),verts2(28,26)
;Skapar resten av högerlod
For x=37 To 63
For z=27 To 35
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=37 To 62
For z=26 To 35
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Höger kopplings pungter
For z=0 To 64
x=0
verts6(1,z)=AddVertex (surf2,288,0,z+224)
verts6(2,z)=AddVertex (surf2,296,0,z+224)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts6(1,z)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts6(1,z)
Next
For z=0 To 63 Step 8
x=1
AddTriangle surf2,verts6(x,z),verts6(x,z+1),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+1),verts6(x,z+1+1),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+2),verts6(x,z+1+2),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+3),verts6(x,z+1+3),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+4),verts6(x,z+1+4),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+5),verts6(x,z+1+5),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+6),verts6(x,z+1+6),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+7),verts6(x,z+1+7),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+4),verts6(x+1,z+8),verts6(x+1,z)
;AddTriangle surf2,verts6(x,z),verts6(x+1,z+1),verts6(x+1,z)
Next
;Höger övre kopplings hörn andra tri
AddTriangle surf2,verts6(1,64),verts2(37,36),verts2(37,35)
;Höger nedre kopplings hörn första tri
AddTriangle surf2,verts6(1,0),verts2(37,27),verts2(37,26)
;Höger nedre kopplings hörn andra tri
AddTriangle surf2,verts6(1,0),verts2(37,26),verts2(36,26)
;Load the height map
filein=ReadFile("world.map")
sizex=ReadFloat#(filein)
sizez=ReadFloat#(filein)
For xx=0 To 1023
For zz=0 To 1023
wd#(xx,zz)=Float(ReadFloat#(filein))/2
Next
Next
CloseFile filein
;Global hmap=LoadImage("startworld.bmp")
;If Not hmap Then Print "Failed to find bigworld.bmp" : Delay 3000 : End
;load total height map
;For xx=0 To 1023
;For zz=0 To 1023
; yz#=0
; For x1=0 To 5
; For z1=0 To 5
; y1#=ReadPixel (x1+xx,z1+zz,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
; Next
;y#=yz#/36.0
;y1#=ReadPixel (xx,zz,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; y#=y1#/36.0
; wd#(xx,zz)=y1#
;If maxy#<y# Then maxy#=y#
;Next
;Print xx
;Next
;Set lod heightmap.
For i=0 To CountVertices ( surf2 )-1
x=VertexX#(surf2,i)
z=VertexZ#(surf2,i)
;yz#=0
;For x1=0 To 5
; For z2=0 To 5
; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
;Next
;y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexTexCoords surf2,i,VertexX#(surf2,i),VertexZ#(surf2,i)
Next
;Set detail height data
For i=0 To CountVertices ( surf1 )-1
x=VertexX#(surf1,i)
z=VertexZ#(surf1,i)
;yz#=0
;For x1=0 To 5
; For z2=0 To 5
; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
;Next
y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i)
Next
MESHnormals( mesh )
texture=LoadTexture("grass.jpg")
ScaleTexture texture,2,2
EntityTexture mesh,texture
texture2=LoadTexture("Moss.bmp")
ScaleTexture texture2,512,512
EntityTexture lodmesh,texture2
;WireFrame True
player=CreateSphere()
PositionEntity player,EntityX(camera),0,EntityZ(camera)
ScaleEntity player,0.5,0.5,0.5
;whater
plane=CreatePlane()
EntityColor plane,50,50,255
PositionEntity plane,0,5,0
;************* Initziate tree ***************************
tree=LoadMesh("tree06.b3d")
t_SPRITE=LoadSprite("leaf01_256.tga",1+4)
ScaleSprite t_sprite,1,1
MoveEntity t_sprite,5,10,5
SpriteViewMode t_SPRITE,1
t_light=25 ; Default Blade lighnes
demo_wood()
While Not KeyHit(1)
; MoveEntity camera,0,0,-1
If KeyDown(17)
MoveEntity camera,0,0,0.1
End If
If KeyDown(31)
MoveEntity camera,0,0,-0.1
End If
smx#=MouseXSpeed()/15
smy#=MouseYSpeed()/15
TurnEntity camera,smy#,-smx#,0
RotateEntity camera,EntityPitch(camera),EntityYaw(camera),0
TranslateEntity camera,0,-1,0
y#=BilinearInterpValue# ( Float(EntityX(camera)) ,Float(EntityZ(camera)) )
;If y#<>0 Then Stop
If y#+0.5>EntityY#(camera)
PositionEntity camera,EntityX(camera),y#+0.5,EntityZ(camera)
jumps=0
yspeed#=0
End If
If KeyDown(200) Then MoveEntity player,0,0,1
If KeyDown(208) Then MoveEntity player,0,0,-1
If KeyDown(203) Then MoveEntity player,-1,0,0
If KeyDown(205) Then MoveEntity player,1,0,0
MoveEntity player,0,-1,0
;Justera Y
y#=BilinearInterpValue# ( Float(EntityX(player)) ,Float(EntityZ(player)) )
;If y#<>0 Then Stop
If y#+0.5>EntityY#(player)
PositionEntity player,EntityX(player),y#+1,EntityZ(player)
jumps=0
yspeed#=0
End If
;move lod and detail map cords.
If MilliSecs()-oldupd > 2000 And KeyHit(57)
oldupd=MilliSecs()
;If KeyHit(57)
TMP_X=Int(EntityX(camera)-228-32)
TMP_Z=Int(EntityZ(camera)-228-32)
PositionEntity lodmesh,TMP_X,0,TMP_Z
For tmp_v1.lodverts1x = Each lodverts1x
If tmp_v1\detailvert <>0
i=tmp_v1\vert1x
e_tx#=VertexX(surf1,tmp_v1\detailvert);Readxpos of connected detail vertex
e_tz#=VertexZ(surf1,tmp_v1\detailvert);readzpos of connected detail vertex
e_y#=VertexY(surf1,tmp_v1\detailvert)
;x=VertexX(surf2,i)+ox
;z=VertexZ(surf2,i)+oz
;If z<0 Or z>1023 Then z=0
;If x<0 Or x>1023 Then x=0
;y#=wd#(x,z)
;VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexCoords surf2,i,e_tx#,e_y#,e_tz#
VertexTexCoords surf2,i,x,z
End If
Next
TMP_X=Int(EntityX(camera)/8)
TMP_X=TMP_X*8-228-32
TMP_Z=Int(EntityZ(camera)/8)
TMP_Z=TMP_z*8-228-32
PositionEntity lodmesh,TMP_X,0,TMP_Z
ox=EntityX(lodmesh)
oz=EntityZ(lodmesh)
;Set lod heightmap.
For tmp_v8.lodverts8x = Each lodverts8x
i=tmp_v8\vert8x
x=VertexX(surf2,i)+ox
z=VertexZ(surf2,i)+oz
If z<0 Or z>1023 Then z=0
If x<0 Or x>1023 Then x=0
y#=wd#(x,z)
VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexTexCoords surf2,i,x,z
Next
;For i=0 To CountVertices ( surf2 )-1
; x=VertexX(surf2,i)+ox
; z=VertexZ(surf2,i)+oz
; If z<0 Or z>1023 Then z=0
; If x<0 Or x>1023 Then x=0
; y#=wd#(x,z)
; VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
; VertexTexCoords surf2,i,x,z
;Next
PositionEntity mesh,Int(EntityX(camera)-228-32),0,Int(EntityZ(camera)-228-32)
ox=EntityX(mesh)
oz=EntityZ(mesh)
;Set detail height data
For i=0 To CountVertices ( surf1 )-1
x=VertexX(surf1,i)+ox
z=VertexZ(surf1,i)+oz
If z<0 Or z>1023 Then z=0
If x<0 Or x>1023 Then x=0
y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i)
VertexTexCoords surf1,i,x,z
Next
MESHnormals( mesh )
;HideEntity lodmesh
End If
animate_leafs()
oldms=MilliSecs()
UpdateWorld()
RenderWorld()
MoveMouse 400,300
Text 0,0,MilliSecs()-oldms
Text 0,20,y#
Text 0,30,EntityX(player)
Text 50,30,EntityY(player)
Text 100,30,EntityZ(player)
Text 0,50,maxy#
Flip
Wend
Function MESHnormals( tmesh )
For l = 1 To CountSurfaces(tmesh )
s = GetSurface( tmesh , l )
For t = 0 To CountTriangles( s )-1
v0 = TriangleVertex( s, t, 0 )
v1 = TriangleVertex( s, t, 1 )
v2 = TriangleVertex( s, t, 2 )
ax# = VertexX( s, v1 ) - VertexX( s, v0 )
ay# = VertexY( s, v1 ) - VertexY( s, v0 )
az# = VertexZ( s, v1 ) - VertexZ( s, v0 )
bx# = VertexX( s, v2 ) - VertexX( s, v1 )
by# = VertexY( s, v2 ) - VertexY( s, v1 )
bz# = VertexZ( s, v2 ) - VertexZ( s, v1 )
Nx# = ( ay * bz ) - ( az * by )
Ny# = ( az * bx ) - ( ax * bz )
Nz# = ( ax * by ) - ( ay * bx )
Ns# = Sqr( Nx * Nx + Ny*Ny + Nz*Nz )
Nx = Nx / Ns
Ny = Ny / Ns
Nz = Nz / Ns
For v = v0 To v2
VertexNormal s, v, Nx, Ny, Nz
Next
Next
Next
End Function
;Usefull functions.
Function BilinearInterpValue# ( x1# , y1# )
X_low = Int ( Floor(x1) )
X_hi = Int ( Ceil (x1) )
Y_low = Int ( Floor(y1) )
Y_hi = Int ( Ceil (y1) )
;Kepp things in bound :)
If X_low < 0 Or X_low > WX Then x_low=0
If X_hi < 0 Or X_hi > WX Then x_hi=0
If Y_low < 0 Or Y_low > WZ Then Y_low=0
If Y_hi < 0 Or Y_hi > WZ Then Y_hi=0
x_per# = x1 - x_low
y_per# = y1 - y_low
p00# = WD# ( x_low , y_low )
p10# = WD# ( x_hi , y_low )
p01# = WD# ( x_low , y_hi )
p11# = WD# ( x_hi , y_hi )
i1# = LinearInterpolate#(p00#,p10#,x_per#)
i2# = LinearInterpolate#(p01#,p11#,x_per#)
Return LinearInterpolate#(i1#,i2#,y_per#)
End Function
;thanks too gabrielknight74. philings2@...
Function LinearInterpolate#(a#,b#,x#)
Return a#+(b#-a#)*x#
End Function
Function animate_leafs()
For t_tr.tree=Each tree
t_tr\anim=t_tr\anim+1
t_a#=Sin(t_tr\anim)*5
For i=1 To t_tr\leafs
RotateSprite t_tr\leaf[i],t_a#
Next
Next
End Function
Function demo_wood()
t_area=64
For it=1 To 40
t_t=CopyEntity(tree)
t_x2#=Rnd(t_area) +228
t_z2#=Rnd(t_area)+228
t_yy2#=wd#(t_x2,t_z2)
PositionEntity t_t,t_x2,t_yy2,t_z2
t_tr.tree = New tree
t_tr\root=1
t_r=Rnd(3)+1
t_filein=ReadFile("tree0"+Str$(t_r)+".t")
t_tr\root=ReadInt(t_filein)
t_leaf=ReadByte(t_filein)
t_tr\leafs=t_leaf
For i=1 To t_leaf
t_obj=ReadInt(t_filein)
t_x#=ReadFloat#(t_filein)
t_y#=ReadFloat#(t_filein)
t_z#=ReadFloat#(t_filein)
t_tr\leaf[i]=CopyEntity(t_sprite,t_t)
EntityColor t_tr\leaf[i],255,128+Rnd(128),255
PositionEntity t_tr\leaf[i],t_x#,t_y#,t_z#
Next
RotateEntity t_t,Rnd(30)-15,Rnd(360),0
;rad#=Rnd(20)/20.0+0.7
rad#=0.15
ScaleEntity t_t,rad#,rad#,rad#
CloseFile t_filein
Next
End Function
;******************************** Pre render *********************
Function prerender()
WireFrame True
CameraClsColor camera,0,0,0
PositionEntity camera,250,45,300
RotateEntity camera,90,0,0
UpdateWorld
RenderWorld
Flip
WaitKey
End Function
;*****************************************************************
[/CODE]
Here is a fun problem that iam working on.
1) Create a detailmesh
2) Create a lod mesh
3) Join em together using blitz3d vertexX and vertexY
4) Have a command that Rerender em both. But LOD detail must sustain stable.
Question:
Iam trying to do above. but always run into difirent problems.
What do you all other think.
here is some code iam using.. not working propper (Planing to scrap it)
[CODE]
;Lod experment 2006-12-31 22:16
;********* Treemodels ***************************
Type tree
Field root ;Nunber of root tree usaly 1
Field leaf[128] ;Pointer to branch mesh
Field light[128]
Field leafs
Field anim
End Type
Global tree,t_sprite,t_light
Global t_anim,t_leaf
;***********************************************
;LodVerts 8x
Type lodverts8x
Field vert8x
End Type
;Lodverts 1x
Type lodverts1x
Field vert1x ;Nev vertices på LOD mesh som ska flyttas till detail verts.
Field detailvert ;Den vertices som den joinar på detail meshen
End Type
;Camera thins
Global camera
;Datas.
Dim verts1(64,64) ;Detail mesh
Dim verts2(64,64) ;Lod mesh
Dim verts3(64,2) ;Över kopplings pungt på lod.
Dim verts4(2,64) ;Vänster kopplings punger på lod.
Dim verts5(64,2) ;Nedre kopplings pungt på lod.
Dim verts6(2,64) ;Högre kopplings pungter på lod.
Dim wd#(1025,1025) ; World array height data
Global wx=1024,wz=1024
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()
Cls
camera=CreateCamera()
CameraViewport camera,0,0,1024,768
PositionEntity camera,256,120,256-16
CameraClsColor camera,127,128,255
CameraFogColor camera,127,128,255
CameraFogRange camera,32,250
CameraFogMode camera,1
CameraRange camera,0.1,500
;TurnEntity camera,90,0,0
light=CreateLight()
;------- Detail mesh --------------
mesh=CreateMesh()
surf1=CreateSurface(mesh)
;Skapar pungterna för detail mapen
For x=0 To 64
For z=0 To 64
verts1(x,z)=AddVertex (surf1,x+224,0,z+224,x,z)
Next
Next
;Kopplar polygonerna i meshen
For x=0 To 63
For z=0 To 63
AddTriangle surf1,verts1(x,z),verts1(x,z+1),verts1(x+1,z+1)
AddTriangle surf1,verts1(x,z),verts1(x+1,z+1),verts1(x+1,z)
Next
Next
;---------------------------------
;--------- LOD mesh ------------------
;Skapar LOD mesh som ska kopplas runt detail meshen
lodmesh=CreateMesh()
surf2=CreateSurface(lodmesh)
;Skapar lagret som ska vara Högst upp. Aka 512 till 64
For x=1 To 63
For z=36 To 64
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8,x*8,z*8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 62
For z=36 To 63
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Skapar Kopplings pungt 1 vertikal överts
For x=0 To 64
verts3(x,1)=AddVertex (surf2,x+224,0,1+228+59)
verts3(x,2)=AddVertex (surf2,x+224,0,2+228+66)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts3(x,1)
tmp_v1\detailvert = verts1(x,64)
;***** Debug code ************************
Goto holycraphigh
sphere=CreateSphere()
ScaleEntity sphere,0.2,0.2,0.2
tx=VertexX(surf1,tmp_v1\detailvert)
tz=VertexZ(surf1,tmp_v1\detailvert)
PositionEntity sphere,tx,0,tz
EntityColor sphere,0,255,0
cube=CreateCube()
ScaleEntity cube,0.3,0.3,0.3
tx=VertexX(surf2,tmp_v1\vert1x)
tz=VertexZ(surf2,tmp_v1\vert1x)
PositionEntity cube,tx,0,tz
EntityColor cube,255,0,0
prerender
.holycraphigh
;*****************************************
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts3(x,2)
Next
For x=0 To 63 Step 8
z=1
AddTriangle surf2,verts3(x,z),verts3(x,z+1),verts3(x+1,z)
AddTriangle surf2,verts3(x+1,z),verts3(x,z+1),verts3(x+1+1,z)
AddTriangle surf2,verts3(x+2,z),verts3(x,z+1),verts3(x+1+2,z)
AddTriangle surf2,verts3(x+3,z),verts3(x,z+1),verts3(x+1+3,z)
AddTriangle surf2,verts3(x+4,z),verts3(x+8,z+1),verts3(x+1+4,z)
AddTriangle surf2,verts3(x+5,z),verts3(x+8,z+1),verts3(x+1+5,z)
AddTriangle surf2,verts3(x+6,z),verts3(x+8,z+1),verts3(x+1+6,z)
AddTriangle surf2,verts3(x+7,z),verts3(x+8,z+1),verts3(x+1+7,z)
AddTriangle surf2,verts3(x+4,z),verts3(x,z+1),verts3(x+8,z+1)
;AddTriangle surf2,verts3(x,z),verts3(x+1,z+1),verts3(x+1,z)
Next
;Skapar vänster övere hörn bit
AddTriangle surf2,verts2(27,36),verts2(28,36),verts3(0,1)
;Skapar Höger övre bit
AddTriangle surf2,verts2(36,36),verts2(37,36),verts3(64,1)
;--------------------------------------
;Skapar Resten av Vänster kant
For x=0 To 27
For z=0 To 35
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 26
For z=1 To 35
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Vänster kopplings pungter
For z=0 To 64
x=0
verts4(1,z)=AddVertex (surf2,216,0,z+224)
verts4(2,z)=AddVertex (surf2,224,0,z+224)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts4(1,z)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts4(2,z)
Next
For z=0 To 63 Step 8
x=1
;AddTriangle surf2,verts4(x,z),verts4(x,z+1),verts4(x+1,z+1)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1),verts4(x+1,z)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+1),verts4(x+1,z+1)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+2),verts4(x+1,z+2)
AddTriangle surf2,verts4(x,z),verts4(x+1,z+1+3),verts4(x+1,z+3)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+4),verts4(x+1,z+4)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+5),verts4(x+1,z+5)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+6),verts4(x+1,z+6)
AddTriangle surf2,verts4(x,z+8),verts4(x+1,z+1+7),verts4(x+1,z+7)
AddTriangle surf2,verts4(x,z),verts4(x,z+8),verts4(x+1,z+4)
Next
;Skapar vänster övere bit 2
AddTriangle surf2,verts2(27,36),verts4(2,64),verts2(27,35)
;Skapar resten av nedre lod
;Skapar lagret som ska vara längst ned.
For x=1 To 63
For z=1 To 26
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=1 To 62
For z=1 To 25
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Skapar Kopplings pungt 1 vertikal överts
For x=0 To 64
verts5(x,1)=AddVertex (surf2,x+224,0,1+215)
verts5(x,2)=AddVertex (surf2,x+224,0,2+215+7)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts5(x,1)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts5(x,2)
Next
For x=0 To 63 Step 8
z=1
AddTriangle surf2,verts5(x,z),verts5(x,z+1),verts5(x+1,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1+1,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+2,z+1),verts5(x+1+2,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+3,z+1),verts5(x+1+3,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+4,z+1),verts5(x+1+4,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+5,z+1),verts5(x+1+5,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+6,z+1),verts5(x+1+6,z+1)
AddTriangle surf2,verts5(x+8,z),verts5(x+7,z+1),verts5(x+1+7,z+1)
AddTriangle surf2,verts5(x,z),verts5(x+4,z+1),verts5(x+8,z)
;AddTriangle surf2,verts5(x,z),verts5(x+1,z+1),verts5(x+1,z)
Next
;Kopplar höger nedre kopplings hörn
AddTriangle surf2,verts2(27,27),verts4(2,0),verts2(27,26)
AddTriangle surf2,verts2(27,26),verts4(2,0),verts2(28,26)
;Skapar resten av högerlod
For x=37 To 63
For z=27 To 35
verts2(x,z)=AddVertex (surf2,x*8,0,z*8+8)
tmp_v8.lodverts8x = New lodverts8x
tmp_v8\vert8x=verts2(x,z)
Next
Next
For x=37 To 62
For z=26 To 35
AddTriangle surf2,verts2(x,z),verts2(x,z+1),verts2(x+1,z+1)
AddTriangle surf2,verts2(x,z),verts2(x+1,z+1),verts2(x+1,z)
Next
Next
;Höger kopplings pungter
For z=0 To 64
x=0
verts6(1,z)=AddVertex (surf2,288,0,z+224)
verts6(2,z)=AddVertex (surf2,296,0,z+224)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts6(1,z)
tmp_v1.lodverts1x = New lodverts1x
tmp_v1\vert1x=verts6(1,z)
Next
For z=0 To 63 Step 8
x=1
AddTriangle surf2,verts6(x,z),verts6(x,z+1),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+1),verts6(x,z+1+1),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+2),verts6(x,z+1+2),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+3),verts6(x,z+1+3),verts6(x+1,z)
AddTriangle surf2,verts6(x,z+4),verts6(x,z+1+4),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+5),verts6(x,z+1+5),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+6),verts6(x,z+1+6),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+7),verts6(x,z+1+7),verts6(x+1,z+8)
AddTriangle surf2,verts6(x,z+4),verts6(x+1,z+8),verts6(x+1,z)
;AddTriangle surf2,verts6(x,z),verts6(x+1,z+1),verts6(x+1,z)
Next
;Höger övre kopplings hörn andra tri
AddTriangle surf2,verts6(1,64),verts2(37,36),verts2(37,35)
;Höger nedre kopplings hörn första tri
AddTriangle surf2,verts6(1,0),verts2(37,27),verts2(37,26)
;Höger nedre kopplings hörn andra tri
AddTriangle surf2,verts6(1,0),verts2(37,26),verts2(36,26)
;Load the height map
filein=ReadFile("world.map")
sizex=ReadFloat#(filein)
sizez=ReadFloat#(filein)
For xx=0 To 1023
For zz=0 To 1023
wd#(xx,zz)=Float(ReadFloat#(filein))/2
Next
Next
CloseFile filein
;Global hmap=LoadImage("startworld.bmp")
;If Not hmap Then Print "Failed to find bigworld.bmp" : Delay 3000 : End
;load total height map
;For xx=0 To 1023
;For zz=0 To 1023
; yz#=0
; For x1=0 To 5
; For z1=0 To 5
; y1#=ReadPixel (x1+xx,z1+zz,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
; Next
;y#=yz#/36.0
;y1#=ReadPixel (xx,zz,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; y#=y1#/36.0
; wd#(xx,zz)=y1#
;If maxy#<y# Then maxy#=y#
;Next
;Print xx
;Next
;Set lod heightmap.
For i=0 To CountVertices ( surf2 )-1
x=VertexX#(surf2,i)
z=VertexZ#(surf2,i)
;yz#=0
;For x1=0 To 5
; For z2=0 To 5
; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
;Next
;y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexTexCoords surf2,i,VertexX#(surf2,i),VertexZ#(surf2,i)
Next
;Set detail height data
For i=0 To CountVertices ( surf1 )-1
x=VertexX#(surf1,i)
z=VertexZ#(surf1,i)
;yz#=0
;For x1=0 To 5
; For z2=0 To 5
; y1#=ReadPixel (x+x1,z+z1,ImageBuffer(hmap)) And 255
; yz#=yz#+y1#
; Next
;Next
y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i)
Next
MESHnormals( mesh )
texture=LoadTexture("grass.jpg")
ScaleTexture texture,2,2
EntityTexture mesh,texture
texture2=LoadTexture("Moss.bmp")
ScaleTexture texture2,512,512
EntityTexture lodmesh,texture2
;WireFrame True
player=CreateSphere()
PositionEntity player,EntityX(camera),0,EntityZ(camera)
ScaleEntity player,0.5,0.5,0.5
;whater
plane=CreatePlane()
EntityColor plane,50,50,255
PositionEntity plane,0,5,0
;************* Initziate tree ***************************
tree=LoadMesh("tree06.b3d")
t_SPRITE=LoadSprite("leaf01_256.tga",1+4)
ScaleSprite t_sprite,1,1
MoveEntity t_sprite,5,10,5
SpriteViewMode t_SPRITE,1
t_light=25 ; Default Blade lighnes
demo_wood()
While Not KeyHit(1)
; MoveEntity camera,0,0,-1
If KeyDown(17)
MoveEntity camera,0,0,0.1
End If
If KeyDown(31)
MoveEntity camera,0,0,-0.1
End If
smx#=MouseXSpeed()/15
smy#=MouseYSpeed()/15
TurnEntity camera,smy#,-smx#,0
RotateEntity camera,EntityPitch(camera),EntityYaw(camera),0
TranslateEntity camera,0,-1,0
y#=BilinearInterpValue# ( Float(EntityX(camera)) ,Float(EntityZ(camera)) )
;If y#<>0 Then Stop
If y#+0.5>EntityY#(camera)
PositionEntity camera,EntityX(camera),y#+0.5,EntityZ(camera)
jumps=0
yspeed#=0
End If
If KeyDown(200) Then MoveEntity player,0,0,1
If KeyDown(208) Then MoveEntity player,0,0,-1
If KeyDown(203) Then MoveEntity player,-1,0,0
If KeyDown(205) Then MoveEntity player,1,0,0
MoveEntity player,0,-1,0
;Justera Y
y#=BilinearInterpValue# ( Float(EntityX(player)) ,Float(EntityZ(player)) )
;If y#<>0 Then Stop
If y#+0.5>EntityY#(player)
PositionEntity player,EntityX(player),y#+1,EntityZ(player)
jumps=0
yspeed#=0
End If
;move lod and detail map cords.
If MilliSecs()-oldupd > 2000 And KeyHit(57)
oldupd=MilliSecs()
;If KeyHit(57)
TMP_X=Int(EntityX(camera)-228-32)
TMP_Z=Int(EntityZ(camera)-228-32)
PositionEntity lodmesh,TMP_X,0,TMP_Z
For tmp_v1.lodverts1x = Each lodverts1x
If tmp_v1\detailvert <>0
i=tmp_v1\vert1x
e_tx#=VertexX(surf1,tmp_v1\detailvert);Readxpos of connected detail vertex
e_tz#=VertexZ(surf1,tmp_v1\detailvert);readzpos of connected detail vertex
e_y#=VertexY(surf1,tmp_v1\detailvert)
;x=VertexX(surf2,i)+ox
;z=VertexZ(surf2,i)+oz
;If z<0 Or z>1023 Then z=0
;If x<0 Or x>1023 Then x=0
;y#=wd#(x,z)
;VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexCoords surf2,i,e_tx#,e_y#,e_tz#
VertexTexCoords surf2,i,x,z
End If
Next
TMP_X=Int(EntityX(camera)/8)
TMP_X=TMP_X*8-228-32
TMP_Z=Int(EntityZ(camera)/8)
TMP_Z=TMP_z*8-228-32
PositionEntity lodmesh,TMP_X,0,TMP_Z
ox=EntityX(lodmesh)
oz=EntityZ(lodmesh)
;Set lod heightmap.
For tmp_v8.lodverts8x = Each lodverts8x
i=tmp_v8\vert8x
x=VertexX(surf2,i)+ox
z=VertexZ(surf2,i)+oz
If z<0 Or z>1023 Then z=0
If x<0 Or x>1023 Then x=0
y#=wd#(x,z)
VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
VertexTexCoords surf2,i,x,z
Next
;For i=0 To CountVertices ( surf2 )-1
; x=VertexX(surf2,i)+ox
; z=VertexZ(surf2,i)+oz
; If z<0 Or z>1023 Then z=0
; If x<0 Or x>1023 Then x=0
; y#=wd#(x,z)
; VertexCoords surf2,i,VertexX#(surf2,i),y#,VertexZ#(surf2,i)
; VertexTexCoords surf2,i,x,z
;Next
PositionEntity mesh,Int(EntityX(camera)-228-32),0,Int(EntityZ(camera)-228-32)
ox=EntityX(mesh)
oz=EntityZ(mesh)
;Set detail height data
For i=0 To CountVertices ( surf1 )-1
x=VertexX(surf1,i)+ox
z=VertexZ(surf1,i)+oz
If z<0 Or z>1023 Then z=0
If x<0 Or x>1023 Then x=0
y#=yz#/36.0
y#=wd#(x,z)
VertexCoords surf1,i,VertexX#(surf1,i),y#,VertexZ#(surf1,i)
VertexTexCoords surf1,i,x,z
Next
MESHnormals( mesh )
;HideEntity lodmesh
End If
animate_leafs()
oldms=MilliSecs()
UpdateWorld()
RenderWorld()
MoveMouse 400,300
Text 0,0,MilliSecs()-oldms
Text 0,20,y#
Text 0,30,EntityX(player)
Text 50,30,EntityY(player)
Text 100,30,EntityZ(player)
Text 0,50,maxy#
Flip
Wend
Function MESHnormals( tmesh )
For l = 1 To CountSurfaces(tmesh )
s = GetSurface( tmesh , l )
For t = 0 To CountTriangles( s )-1
v0 = TriangleVertex( s, t, 0 )
v1 = TriangleVertex( s, t, 1 )
v2 = TriangleVertex( s, t, 2 )
ax# = VertexX( s, v1 ) - VertexX( s, v0 )
ay# = VertexY( s, v1 ) - VertexY( s, v0 )
az# = VertexZ( s, v1 ) - VertexZ( s, v0 )
bx# = VertexX( s, v2 ) - VertexX( s, v1 )
by# = VertexY( s, v2 ) - VertexY( s, v1 )
bz# = VertexZ( s, v2 ) - VertexZ( s, v1 )
Nx# = ( ay * bz ) - ( az * by )
Ny# = ( az * bx ) - ( ax * bz )
Nz# = ( ax * by ) - ( ay * bx )
Ns# = Sqr( Nx * Nx + Ny*Ny + Nz*Nz )
Nx = Nx / Ns
Ny = Ny / Ns
Nz = Nz / Ns
For v = v0 To v2
VertexNormal s, v, Nx, Ny, Nz
Next
Next
Next
End Function
;Usefull functions.
Function BilinearInterpValue# ( x1# , y1# )
X_low = Int ( Floor(x1) )
X_hi = Int ( Ceil (x1) )
Y_low = Int ( Floor(y1) )
Y_hi = Int ( Ceil (y1) )
;Kepp things in bound :)
If X_low < 0 Or X_low > WX Then x_low=0
If X_hi < 0 Or X_hi > WX Then x_hi=0
If Y_low < 0 Or Y_low > WZ Then Y_low=0
If Y_hi < 0 Or Y_hi > WZ Then Y_hi=0
x_per# = x1 - x_low
y_per# = y1 - y_low
p00# = WD# ( x_low , y_low )
p10# = WD# ( x_hi , y_low )
p01# = WD# ( x_low , y_hi )
p11# = WD# ( x_hi , y_hi )
i1# = LinearInterpolate#(p00#,p10#,x_per#)
i2# = LinearInterpolate#(p01#,p11#,x_per#)
Return LinearInterpolate#(i1#,i2#,y_per#)
End Function
;thanks too gabrielknight74. philings2@...
Function LinearInterpolate#(a#,b#,x#)
Return a#+(b#-a#)*x#
End Function
Function animate_leafs()
For t_tr.tree=Each tree
t_tr\anim=t_tr\anim+1
t_a#=Sin(t_tr\anim)*5
For i=1 To t_tr\leafs
RotateSprite t_tr\leaf[i],t_a#
Next
Next
End Function
Function demo_wood()
t_area=64
For it=1 To 40
t_t=CopyEntity(tree)
t_x2#=Rnd(t_area) +228
t_z2#=Rnd(t_area)+228
t_yy2#=wd#(t_x2,t_z2)
PositionEntity t_t,t_x2,t_yy2,t_z2
t_tr.tree = New tree
t_tr\root=1
t_r=Rnd(3)+1
t_filein=ReadFile("tree0"+Str$(t_r)+".t")
t_tr\root=ReadInt(t_filein)
t_leaf=ReadByte(t_filein)
t_tr\leafs=t_leaf
For i=1 To t_leaf
t_obj=ReadInt(t_filein)
t_x#=ReadFloat#(t_filein)
t_y#=ReadFloat#(t_filein)
t_z#=ReadFloat#(t_filein)
t_tr\leaf[i]=CopyEntity(t_sprite,t_t)
EntityColor t_tr\leaf[i],255,128+Rnd(128),255
PositionEntity t_tr\leaf[i],t_x#,t_y#,t_z#
Next
RotateEntity t_t,Rnd(30)-15,Rnd(360),0
;rad#=Rnd(20)/20.0+0.7
rad#=0.15
ScaleEntity t_t,rad#,rad#,rad#
CloseFile t_filein
Next
End Function
;******************************** Pre render *********************
Function prerender()
WireFrame True
CameraClsColor camera,0,0,0
PositionEntity camera,250,45,300
RotateEntity camera,90,0,0
UpdateWorld
RenderWorld
Flip
WaitKey
End Function
;*****************************************************************
[/CODE]