Quote: "did my effort not count as a submission for your challenge? "
Mine too, it generates a random colormap which can be used as a 2d terrain? If all you want is a bunch of areas of different colours then I'll reduce the colours in my height scale to make the image look poorer, but more like acelepage's entry?
*Edit*
Right, I've converted mine to generate a 5 colour colourmap to signify Deep water, shallow water, sand, grassland, and ice caps. All I did was to take my 256 colour gradient, reduce it to 5 colours, and replace the data at the end with the new data et voila!
Set Display Mode 800, 600, 32
Sync On : Sync Rate 0 : Sync
Dim TextureLookup( 256 ) As DWord
Global Scale# = 25.0
Do
Fog On : Fog Color Rgb( 0, 0, 128 ) : Fog Distance 128.0 * Scale#
Set Camera Range 0.1, 128.0 * Scale#
GenerateHeightScale()
Det = MakeDetailMap()
Wat = MakeWaterImg()
Seed = Timer()
Noise = GenerateNoise( Seed, 256, 7, 1 ) : Save Image "Height.png", Noise
Col = MakeColourMap( Noise )
Ter = CreateTerrain( "Height.png", Col, Det )
Water = GetBlankObjNo()
Make Object Plain Water, 256 * Scale#, 256 * Scale#
Position Object Water, 0, 16.0 * Scale#, 0
XRotate Object Water, 90.0
Fix Object Pivot Water
Texture Object Water, Wat
Ghost Object On Water : Fade Object Water, 50
Position Camera 0.0, 256.0 * Scale#, 0.0
While Not ReturnKey()
OldX# = CurveValue( XPos#, Camera Position X(), 300 )
OldZ# = CurveValue( ZPos#, Camera Position Z(), 300 )
XPos# = ( 64 * Scale# ) * Sin( Wrapvalue( Timer() * 0.00625 ) ) : ZPos# = ( 64 * Scale# ) * Cos( Wrapvalue( Timer() * 0.0125 ) )
CamY# = Get Terrain Ground Height( Ter, OldX#, OldZ# )
PointY# = Get Terrain Ground Height( Ter, XPos#, ZPos# )
Position Camera OldX#, CamY# + ( 5.0 * Scale# ), OldZ# : Point Camera XPos#, PointY# + ( 5.0 * Scale# ), ZPos#
XRotate Object Water, ( 0.5 * Sin( Wrapvalue( Timer() * 0.025 ) ) )
ZRotate Object Water, ( 0.5 * Sin( Wrapvalue( Timer() * 0.05 ) ) )
If Spacekey()
Paste Image Noise, 0, 20
Paste Image Col, 256, 20
EndIf
Text 0, 0, Str$( Seed )
Sync
EndWhile
Delete Image Noise
Delete Image Col
Delete Image Wat
Destroy Terrain Ter
Delete Object Water
Set Display Mode 800, 600, 32
Loop
End
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function MakeWaterImg()
Bmp = GetBlankBmpNo()
Create Bitmap Bmp, 256, 256
Set Current Bitmap Bmp
Ink Rgb( 0, 0, 255 ), 0
Box 0, 0, 256, 256
Sync
Wat = GetBlankImgNo()
Get Image Wat, 0, 0, 256, 256, 1
Set Current Bitmap 0
Delete Bitmap Bmp
EndFunction Wat
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
`Convert matrix to plain.......
Function MakeColourMap( Img )
Bmp = GetBlankBmpNo()
Create Bitmap Bmp, 256, 256
Set Current Bitmap Bmp
Cls
Paste Image Img, 0, 0
For Y = 0 To 255
For X = 0 To 255
Dot X, Y, TextureLookup( RgbR( Point( X, Y ) ) )
Next X
Next Y
Sync
Col = GetBlankImgNo()
Get Image Col, 0, 0, 256, 256
Set Current Bitmap 0
Delete Bitmap Bmp
EndFunction Col
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function MakeDetailMap()
Bmp = GetBlankBmpNo()
Create Bitmap Bmp, 256, 256
Set Current Bitmap Bmp
Set Bitmap Format 21
Ink Rgb( 128, 128, 128 ), 0
Box 0, 0, 256, 256
Sync
Det = GetBlankImgNo()
Get Image Det, 0, 0, 256, 256, 1
Set Current Bitmap 0
Delete Bitmap Bmp
EndFunction Det
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function CreateTerrain( Height$, Col, Det )
Ter = GetBlankObjNo()
Make Object Terrain Ter ` create the terrain object
Set Terrain Heightmap Ter, Height$ ` set the heightmap
Set Terrain Scale Ter, Scale#, Scale# * 0.2, Scale# ` set the scale
Set Terrain Split Ter, 16 ` split value by 16 * 16
Set Terrain Tiling Ter, 4 ` detail map tiling
Set Terrain Light Ter, 0.15, -1, 0, 0.75, 0.75, 0.75, 0.5 ` light - xdir, ydir, zdir, red, green, blue, intensity
Set Terrain Texture Ter, Col, Det ` base and detail texture
Build Terrain Ter ` finally build the terrain
Delete File Height$
Position Object Ter, 0.0 - ( ( 256.0 * Scale# ) / 2.0 ), 0.0, 0.0 - ( ( 256.0 * Scale# ) / 2.0 )
EndFunction Ter
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetBlankImgNo()
For Num = 1 To 65500
If Image Exist( Num ) = 0
ExitFunction Num
EndIf
Next Num
EndFunction 0
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetBlankObjNo()
For Num = 1 To 65500
If Object Exist( Num ) = 0
ExitFunction Num
EndIf
Next Num
EndFunction 0
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetBlankBmpNo()
For Num = 1 To 32
If Bitmap Exist( Num ) = 0
ExitFunction Num
EndIf
Next Num
EndFunction 0
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetBlankSprNo()
For Num = 1 To 65500
If Sprite Exist( Num ) = 0
ExitFunction Num
EndIf
Next Num
EndFunction 0
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetImageWidth( ImgNo )
Spr = GetBlankSprNo()
Sprite Spr, 0, 0, ImgNo
Width = Sprite Width( Spr )
Delete Sprite Spr
EndFunction Width
`============================================================================================================================
`============================================================================================================================
`============================================================================================================================
Function GetImageHeight( ImgNo )
Spr = GetBlankSprNo()
Sprite Spr, 0, 0, ImgNo
Height = Sprite Height(Spr)
Delete Sprite Spr
EndFunction Height
`Perlin Noise Courtesy of Dark Coder ;) ()
Function GenerateNoise( Seed, startingRes, totalOctaves, Sampling )
Randomize Seed
If startingRes > 512 Then startingRes = 512
If totalOctaves > 8 Then totalOctaves = 8
// Generate noise for all octaves
for octaveID = 1 to totalOctaves
memblockID = octaveID
octaveRes = startingRes / 2 ^ (octaveID - 1)
Make Memblock memblockID, octaveRes * octaveRes * 4 // A single float
for x = 0 to octaveRes - 1
for y = 0 to octaveRes - 1
Write Memblock Float memblockID, ( x + y * octaveRes ) * 4, ( Rnd(2000) - 1000 ) * 0.001
next
next
next
// add all layers together
memblockID = totalOctaves + 1
Make Memblock memblockID, 12 + startingRes * startingRes * 4
Write Memblock DWord memblockID, 0, startingRes
Write Memblock DWord memblockID, 4, startingRes
Write Memblock DWord memblockID, 8, 32
minHeight# = -1.9
maxHeight# = 1.9
minInv# = -minHeight#
heightRange# = maxHeight# - minHeight#
_255DivRange# = 255.0 / heightRange#
sResReciprocal# = 1.0 / (startingRes)
for x = 0 to startingRes - 1
for y = 0 to startingRes - 1
x# = x * sResReciprocal#
y# = y * sResReciprocal#
height# = 0.0
Strength# = 1.0
`height# = Memblock Float( 1, ( x + y * startingRes ) * 4 )
for OctaveID = totalOctaves to 1 step -1
`for OctaveID = 7 to 7 step -1
octaveRes = startingRes / 2 ^ (octaveID - 1)
// Store the float pixel we are over on the current octave
memblockX# = x# * octaveRes
memblockY# = y# * octaveRes
// Store the int version for pixel sampling
memblockX = memblockX#
memblockY = memblockY#
// Get the local offset
memblockX# = memblockX# mod 1.0
memblockY# = memblockY# mod 1.0
If Sampling = 1
`BiCubic Sampling
sample1# = Sample( OctaveID, memblockX - 1, memblockY - 1, octaveRes )
sample2# = Sample( OctaveID, memblockX , memblockY - 1, octaveRes )
sample3# = Sample( OctaveID, memblockX + 1, memblockY - 1, octaveRes )
sample4# = Sample( OctaveID, memblockX + 2, memblockY - 1, octaveRes )
mHeight1# = CubicInterpolate( sample1#, sample2#, sample3#, sample4#, memblockX# )
sample1# = Sample( OctaveID, memblockX - 1, memblockY , octaveRes )
sample2# = Sample( OctaveID, memblockX , memblockY , octaveRes )
sample3# = Sample( OctaveID, memblockX + 1, memblockY , octaveRes )
sample4# = Sample( OctaveID, memblockX + 2, memblockY , octaveRes )
mHeight2# = CubicInterpolate( sample1#, sample2#, sample3#, sample4#, memblockX# )
sample1# = Sample( OctaveID, memblockX - 1, memblockY + 1, octaveRes )
sample2# = Sample( OctaveID, memblockX , memblockY + 1, octaveRes )
sample3# = Sample( OctaveID, memblockX + 1, memblockY + 1, octaveRes )
sample4# = Sample( OctaveID, memblockX + 2, memblockY + 1, octaveRes )
mHeight3# = CubicInterpolate( sample1#, sample2#, sample3#, sample4#, memblockX# )
sample1# = Sample( OctaveID, memblockX - 1, memblockY + 2, octaveRes )
sample2# = Sample( OctaveID, memblockX , memblockY + 2, octaveRes )
sample3# = Sample( OctaveID, memblockX + 1, memblockY + 2, octaveRes )
sample4# = Sample( OctaveID, memblockX + 2, memblockY + 2, octaveRes )
mHeight4# = CubicInterpolate( sample1#, sample2#, sample3#, sample4#, memblockX# )
mHeight# = CubicInterpolate( mHeight1#, mHeight2#, mHeight3#, mHeight4#, memblockY# )
Else
`BiLinear Sampling
sample1# = Sample( OctaveID, memblockX , memblockY, octaveRes )
sample2# = Sample( OctaveID, memblockX + 1, memblockY, octaveRes )
mHeightX# = Linear_Interpolate( sample1#, sample2#, memblockX# )
sample1# = Sample( OctaveID, memblockX , memblockY + 1, octaveRes)
sample2# = Sample( OctaveID, memblockX + 1, memblockY + 1, octaveRes)
mHeightY# = Linear_Interpolate( sample1#, sample2#, memblockX# )
mHeight# = Linear_Interpolate( mHeightX#, mHeightY#, memblockY# )
EndIf
height# = height# + mHeight# * Strength#
Strength# = Strength# * 0.5
next
height = (height# + minInv#) * _255DivRange#
if height > 255 then height = 255
if height < 0 then height = 0
Write Memblock Byte memblockID, 12 + ( x + y * startingRes ) * 4 , height // B
Write Memblock Byte memblockID, 12 + ( x + y * startingRes ) * 4 + 1, height // G
Write Memblock Byte memblockID, 12 + ( x + y * startingRes ) * 4 + 2, height // R
Write Memblock Byte memblockID, 12 + ( x + y * startingRes ) * 4 + 3, 255 // A
next
next
// Create image
Img = GetBlankImgNo()
Make Image From Memblock Img, memblockID
For octaveID = 1 to totalOctaves
Delete Memblock octaveID
Next octaveID
Delete Memblock totalOctaves + 1
Cls
EndFunction Img
Function Sample( memblockID, x, y, memblockRes )
if x < 0 then x = x + memblockRes
if y < 0 then y = y + memblockRes
if x > memblockRes-1 then x = x - memblockRes
if y > memblockRes-1 then y = y - memblockRes
returnValue# = Memblock Float( memblockID, ( x + y * memblockRes ) * 4 )
Endfunction returnValue#
Function Linear_Interpolate( a as float, b as float, x as float )
returnValue# = a * (1.0 - x) + b * x
Endfunction returnValue#
Function CubicInterpolate( aMinOne as float, a as float, b as float, bAddOne as float, acrossAB as float )
P as float
Q as float
R as float
S as float
P = (bAddOne - b) - (aMinOne - a)
Q = (aMinOne - a) - P
R = b - aMinOne
S = a
returnValue# = P * acrossAB ^ 3 + Q * acrossAB ^ 2 + R * acrossAB + S
EndFunction returnValue#
Function GenerateHeightScale()
Restore TextureColours:
For Y = 0 To 255
Read TextureLookup( Y )
Next Y
EndFunction
TextureColours:
Data 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795
Data 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795
Data 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795
Data 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795
Data 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795, 4278725795
Data 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540
Data 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540
Data 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540
Data 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540
Data 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540, 4284984540
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652, 4293325652
Data 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816
Data 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816
Data 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816
Data 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816
Data 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816, 4281452816
Data 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295
Data 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295
Data 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295
Data 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295
My signature is NOT a moderator plaything! Stop changing it!
