Я игрой (Bombers3D) занялся серьезно только этим летом, хотя задумал написать ее еще полтора года назад когда у меня Blitz появился
А пока вот усовершенствованная функция-генератор террейна:
Function GenerateTerrain%(SizeX#,SizeZ#,MaxHeight#,HeightMapFile$,DetailX%=0,DetailZ%=0,VertexColorsMap$="")
;#Region Собственно генератор террейна
Local HeightMapImage%=LoadImage(HeightMapFile$)
DetailX%=Abs(DetailX%): DetailZ%=Abs(DetailZ%)
;Автоматический выбор детализации используя HeightMap
If DetailX%=0 Then
DetailX%=ImageWidth(HeightMapImage%)
EndIf
If DetailZ%=0 Then
DetailZ%=ImageHeight(HeightMapImage%)
EndIf
;Это чтобы упростить нахождение высоты вертекса при несоответствии HeightMap'a
;указанной детализации
If DetailX%<>ImageWidth(HeightMapImage%) Or DetailZ%<>ImageHeight(HeightMapImage%) Then
ResizeImage(HeightMapImage%,DetailX,DetailZ)
EndIf
Local StepX#=SizeX#/Float#(DetailX-1)
Local StepZ#=SizeZ#/Float#(DetailZ-1)
Local Mesh%=CreateMesh()
Local Surface%=CreateSurface(Mesh)
Local X#,Z#,H#,K#=3*255
Local I#,J#
;Расположение вертексов
SetBuffer ImageBuffer(HeightMapImage%)
For I=0 To DetailZ-1
Z=SizeZ#*0.5-I*StepZ#
For J=0 To DetailX-1
GetColor(J,I)
H#=(ColorRed()+ColorGreen()+ColorBlue())/K ;H = 0 .. 1
X=-SizeX#*0.5+J*StepX#
AddVertex(Surface,X,MaxHeight#*H#,Z,J/Float#(DetailX-1),I/Float#(DetailZ-1))
Next
Next
SetBuffer BackBuffer()
FreeImage(HeightMapImage%)
;Создание поверхности
For I=0 To DetailZ-2
For J=0 To DetailX-2
AddTriangle (Surface%,DetailX*I+J, DetailX*I+J+1, J+1+DetailX*(I+1))
AddTriangle (Surface%,DetailX*I+J, J+1+DetailX*(I+1), J+DetailX*(I+1))
Next
Next
;#End Region
;#Region Раскрашивание вертексов
If VertexColorsMap$<>"" Then
Local ColorImage%
EntityFX Mesh%,2;Использование режима 'use vertex colors instead of brush color'
ColorImage%=LoadImage(VertexColorsMap$)
;Изменение размера ColorMap при несовпадении с детализацией
If DetailX%<>ImageWidth(ColorImage%) Or DetailZ%<>ImageHeight(ColorImage%) Then
ResizeImage(ColorImage%,DetailX,DetailZ);Это чтобы упростить нахождение цвета вертекса
EndIf
SetBuffer ImageBuffer(ColorImage%)
For I=0 To DetailZ-1
For J=0 To DetailX-1
GetColor(J,I)
VertexColor(Surface%,DetailX*I+J,ColorRed(),ColorGreen(),ColorBlue())
Next
Next
SetBuffer BackBuffer()
FreeImage(ColorImage%)
EndIf
;#End Region
UpdateNormals(Mesh%)
Return Mesh%
End Function
Решил что так будет универсальнее...