Oblivion style Detail Lowdetail map help.

Blitz3D Forums/Blitz3D Programming/Oblivion style Detail Lowdetail map help.

Wings(Posted 2007) [#1]
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]


Stevie G(Posted 2007) [#2]
I know English isn't your first language but your issue is as clear as mud .. at least to me ;)

If your code didn't require external files then it'd make more sense once I'd run it. Can you do a shortened version without this requirement?

Stevie


Wings(Posted 2007) [#3]
you right.. i restart project..

i do a better next time :)


Wings(Posted 2007) [#4]
Now its next time..

its going well. using entityorder 10 on lod to make it draw on screen first.. thoe got me into trouble.

some times LOD map dosent clip on right spot. making LOD apear in Air.. verry uggly.. this is common problem.. i thinking of a sollution but never came up with any right now.



;Lodworld example v2

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

camera = CreateCamera()
CameraRange camera,0.1,1000

light = CreateLight()

Dim verts1(64,64) ; Detail mesh
Dim verts2(64,64) ; Lod mesh (Used to display far far landscape)


;------- 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,0,z,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 --------------
Lodmesh=CreateMesh()
surf2=CreateSurface(Lodmesh)
;Skapar punkterna för detail mapen
For x=0 To 64
For z=0 To 64

verts2(x,z)=AddVertex (surf2,x*10,0,z*10,x,z)

Next
Next


;Kopplar polygonerna i meshen

For x=0 To 63
For z=0 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

;---------------------------------







;Loading height map
heightmap=LoadImage("heightmap.bmp")

For x=0 To 64
For z=0 To 64
y=ReadPixel (x,z,ImageBuffer(heightmap)) And 255
y=y/3

VertexCoords(surf1,verts1(x,z),x,y,z)
Next
Next





;Set height map on LOD 10x of detail


For x=0 To 64
For z=0 To 64
y=ReadPixel (x*10,z*10,ImageBuffer(heightmap)) And 255
y=y/3

VertexCoords(surf2,verts2(x,z),x*10,y,z*10)
Next
Next












PositionEntity camera,32,50,32
;RotateEntity camera,45,0,0




MESHnormals( mesh )



tex_detail0=LoadTexture("grass.jpg")
EntityTexture mesh,tex_detail0



PositionEntity light,-50000,50000,-50000


EntityOrder lodmesh,10


While Not KeyHit(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


MoveMouse 400,300

UpdateWorld()
RenderWorld()

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


jfk EO-11110(Posted 2007) [#5]
(so heightmap.bmp must be 640*640 pixels?)

I think you should not use EntityOrder 10, nor should you render both. Instead I'd try to use EntityAutofade with both, or if this doesn't work I'd implement a by-vertex entityautofade, based on vertex distance and Vertex Alpha. (altering only vertices alpha that are overlapping detail/LOD areas, noless make sure it's not a bottleneck).

Basicly I'd suggest to cut huge meshes in pieces. A huge heightmap of say 2560*2560 may render very fast when you make it a grid of individual mesh patches, each one of a few thousand tris.

Have a look at the ClusterizeMesh sample in the archives.


bytecode77(Posted 2007) [#6]
what the hell is this?
i tested the code and discovered that there are missing external files!
and [CODE] or [CoDe] is no tag here.

if you need webspace uploaders i have one


Wings(Posted 2007) [#7]
yes ignore this post.
i have sen through oblivion trick of lod now.

they accaly have a kind of entity order trick.

to solve my above problem was easy.

just lower the vertex that is under the Detail Mesh. and it shall look just fine.. stay tooned for another post on this matter later..


Wings(Posted 2007) [#8]
Hey i have ben wrong maby or maby not...

cause maby i cold just make al vertices of the lod mesh stay under the detail mesh. it can work. :)


Wings(Posted 2007) [#9]
Ther will be no updates.
i have terminted this idea for a while.

I build gigantic mesh instead.