some of you may remember me... anyway, last year, I've been busy with university and real life, but I also continued my programming, and my little ISO project... and I'm still stuck at the same place: terrain rendering.
here is where I've been able to come so far...
(crappy JPEG compression...)
I don't know why, but I get those strange slopes... but some of them appear to be drawn correctly. This thing is driving me crazy.
and now, the code.
'Loads a Map from a RAW File. (c) JonnyQuest :D
Public Function LoadMap(HeightMapFile As String) As Boolean
Dim nx As Integer, ny As Integer
Dim ycurrent As Byte
Dim xp As Integer, yp As Integer
nFileNum = FreeFile
Open HeightMapFile For Binary As nFileNum
For ny = 1 To MAP_HEIGHT
xp = (ny * TILE_WIDTH) '+ 60
yp = (ny * (TILE_HEIGHT / 2)) ' + 120
For nx = 1 To MAP_WIDTH
Get nFileNum, , ycurrent
Map(nx, ny).Altitude = ycurrent
Map(nx, ny).TerrainType = ycurrent
Map(nx, ny).Vertex(0).sx = xp
Map(nx, ny).Vertex(0).sy = yp
Map(nx, ny).Vertex(1).sx = xp + TILE_WIDTH
Map(nx, ny).Vertex(1).sy = (yp -(TILE_HEIGHT /2))
Map(nx, ny).Vertex(2).sx = xp + TILE_WIDTH
Map(nx, ny).Vertex(2).sy = (yp +(TILE_HEIGHT /2))
Map(nx, ny).Vertex(3).sx = xp +(TILE_WIDTH * 2)
Map(nx, ny).Vertex(3).sy = yp
xp = xp + TILE_WIDTH
yp = yp - (TILE_HEIGHT / 2)
Next nx
Next ny
Close nFileNum
End Function
and now the rendering one...
Public Sub DrawMap()
Dim Vertice(4) As D3DTLVERTEX
Dim ScreenX As Integer, ScreenY As Integer
Dim xp As Integer, yp As Integer
Select Case RenderState
Case 0
Device3D.SetRenderState D3DRENDERSTATE_FILLMODE, D3DFILL_SOLID
Case 1
Device3D.SetRenderState D3DRENDERSTATE_FILLMODE, D3DFILL_WIREFRAME
Case 2
Device3D.SetRenderState D3DRENDERSTATE_FILLMODE, D3DFILL_POINT
End Select
Device3D.Clear 1, ViewportRect, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1, 0
Device3D.BeginScene
Vertice(0).Color = vbWhite
Vertice(1).Color = vbWhite
Vertice(2).Color = vbWhite
Vertice(3).Color = vbWhite
Vertice(0).rhw = 1
Vertice(1).rhw = 1
Vertice(2).rhw = 1
Vertice(3).rhw = 1
Vertice(0).tu = 0
Vertice(0).tv = 0
Vertice(1).tu = 1
Vertice(1).tv = 0
Vertice(2).tu = 0
Vertice(2).tv = 1
Vertice(3).tu = 1
Vertice(3).tv = 1
For ScreenY = 1 To MAP_HEIGHT - 1
xp = ((ScreenY * TILE_WIDTH)) '+ 60)
yp = ((ScreenY * (TILE_HEIGHT / 2))) ' + 120)
For ScreenX = 1 To MAP_WIDTH - 1
If Not (xp < (-FormRect.Right * 2) Or xp > (FormRect.Right * 2) Or yp < (-FormRect.Bottom * 2) Or yp > (FormRect.Bottom * 2)) Then
Vertice(0).sx = Map(ScreenX, ScreenY).Vertex(0).sx + OffsetX
Vertice(0).sy = Map(ScreenX, ScreenY).Vertex(0).sy - Map(ScreenX, ScreenY).Altitude + OffsetY
Vertice(1).sx = Map(ScreenX, ScreenY).Vertex(1).sx + OffsetX
Vertice(1).sy = Map(ScreenX, ScreenY).Vertex(1).sy - Map(ScreenX + 1, ScreenY).Altitude + OffsetY
Vertice(2).sx = Map(ScreenX, ScreenY).Vertex(2).sx + OffsetX
Vertice(2).sy = Map(ScreenX, ScreenY).Vertex(2).sy - Map(ScreenX + 1, ScreenY + 1).Altitude + OffsetY
Vertice(3).sx = Map(ScreenX, ScreenY).Vertex(3).sx + OffsetX
Vertice(3).sy = Map(ScreenX, ScreenY).Vertex(3).sy - Map(ScreenX, ScreenY + 1).Altitude + OffsetY
Device3D.DrawPrimitive D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, Vertice(0), 4, D3DDP_DEFAULT
Device3D.SetTexture 0, Default
End If
xp = xp + TILE_WIDTH
yp = yp - (TILE_HEIGHT / 2)
Next ScreenX
Next ScreenY
LoadUI
Select Case ShowInfo
Case 0
DisplayInfo (0)
Case 1
DisplayInfo (1)
End Select
Device3D.EndScene
End Sub
Yes, I know it's VB code. I like it like this.
Any help would be appreciated...
-------------------------------------------
GTD Swiss Pride - Orion Class
Swiss 1st Fleet, Sector 32 - Ore Belt - Sol
-------------------------------------------
Edited by - CmdKewin on January 11, 2002 3:07:02 AM
"Elisa, volerò per raggiungerti"-------------------------------------------GTD Swiss Pride - Orion Class Swiss 1st Fleet, Sector 32 - Ore Belt - Sol-------------------------------------------www.jediknight.it