Code archives/3D Graphics - Mesh/Heightmap class
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Easy to use heightmap class. As usual you need to load/set the texture yourself. For updates see: http://www.furi.dk/blitzmax | |||||
' Heightmap class by Odin Jensen (www.furi.dk)
' Free to use as you please :)
Strict
' Heightmap class
Type HeightMap
' Dimensions of map
Field Width:Int
Field Height:Int
Field TileSize:Int
' Map data
Field Data:TBank
' Byte buffer for speed (Still ass slow though :)
Field DataPTR:Byte Ptr
' Load map
Method Load(URL:Object, Width:Int, Height:Int, TileSize:Int)
' Save dimensions
self.Width = Width
self.Height = Height
self.TileSize = TileSize
' Load raw map (Now this is easier than java :)
Data = LoadBank(URL)
' Grab a pointer
DataPTR = BankBuf(Data)
EndMethod
' Draw map (Could be optimized with display lists as it doesn't change, but I'll leave that as an exersize for me or the reader :)
Method Draw()
' Temp height storage
Local Height1:Int = 0;
Local Height2:Int = 0;
Local Height3:Int = 0;
Local Height4:Int = 0;
' Calc offset to center mesh at 0,0,0
Local StartX:Int = -(Width / 2);
Local StartY:Int = -(Height / 2);
' UV coordinate storage
Local u1:Float, u2:Float, u3:Float, u4:Float, v1:Float, v2:Float, v3:Float, v4:Float;
' Vertex color storage
Local Color1:Float, Color2:Float, Color3:Float, Color4:Float
' Shade factor
Local ShadeFactor:Float = 0.20
' We'll convert the 2D map to triangles thank you.
glBegin(GL_TRIANGLES);
' Loop through it
For Local x:Int = 0 To Width
For Local y:Int = 0 To Height
' Grab heights
Height1 = GetHeight(x, y)
Height2 = GetHeight(x, y + TileSize)
Height3 = GetHeight(x + TileSize, y + TileSize)
Height4 = GetHeight(x + TileSize, y)
' Calculate color
Color1 = ShadeFactor + Height1 / 256.0
Color2 = ShadeFactor + Height2 / 256.0
Color3 = ShadeFactor + Height3 / 256.0
Color4 = ShadeFactor + Height4 / 256.0
' Calculate UV coords
u1 = Float(x) / Float(Width);
v1 = Float(y) / Float(Height);
u2 = Float(x) / Float(Width);
v2 = Float(y + TileSize) / Float(Height);
u3 = Float(x + TileSize) / Float(Width);
v3 = Float(y + TileSize) / Float(Height);
u4 = Float(x + TileSize) / Float(Width);
v4 = Float(y) / Float(Height);
' Draw triangles
glColor3f(Color1, Color1, Color1);
glTexCoord2f(u1, v1)
glVertex3i(StartX + x, Height1, StartY + y)
glColor3f(Color2, Color2, Color2);
glTexCoord2f(u2, v2)
glVertex3i(StartX + x, Height2, (StartY + y) + TileSize)
glColor3f(Color4, Color4, Color4);
glTexCoord2f(u4, v4)
glVertex3i((StartX + x) + TileSize, Height4, (StartY+ y))
' Triangle 2
glColor3f(Color4, Color4, Color4);
glTexCoord2f(u4, v4)
glVertex3i((StartX + x) + TileSize, Height4, StartY+ y)
glColor3f(Color2, Color2, Color2);
glTexCoord2f(u2, v2)
glVertex3i(StartX + x, Height2, (StartY + y) + TileSize)
glColor3f(Color3, Color3, Color3);
glTexCoord2f(u3, v3)
glVertex3i((StartX + x) + TileSize, Height3, (StartY + y) + TileSize)
' Advance y
y = y + TileSize-1
Next
' Advance x
x = x + TileSize-1
Next
' End triangle rendering
glEnd();
EndMethod
' Get height. Use this to make the player walk on the map :)
Method GetHeight:Int(X:Int, Y:Int)
' Get position in 2D map space
Local Tx:Int = X Mod Width;
Local Ty:Int = Y Mod Height;
' Grab from data
Return DataPTR[Tx + (Ty * Width)]
EndMethod
EndType |
Comments
None.
Code Archives Forum