have some result:
1)need calculate normals
normal = cross product of two vectors forming a trtiangle
2)UV and texture
// Project: MarchingCubes1
// Created: 21-12-12
// show all errors
SetErrorMode(2)
// set window properties
SetWindowTitle( "MarchingCubes1" )
SetWindowSize( 1024, 768, 0 )
SetWindowAllowResize( 1 ) // allow the user to resize the window
// set display properties
SetVirtualResolution( 1024, 768 ) // doesn't have to match the window
SetOrientationAllowed( 1, 1, 1, 1 ) // allow both portrait and landscape on mobile devices
SetSyncRate( 30, 0 ) // 30fps instead of 60 to save battery
SetScissor( 0,0,0,0 ) // use the maximum available screen space, no black borders
UseNewDefaultFonts( 1 )
global terrainSurface as float = 0.5
#constant width 32
#constant height 8
#constant arrw 32
#constant arrh 8
#constant arrz 32
global terrainMap as float[arrw,arrh,arrz]
global vertices as Vector3[0]
global triangles as integer[0]
global CornerTable as Vector3Int[7]
global emptyVector3Int as Vector3Int
global CornerTable_i as integer = 0
newVector3Int(0, 0, 0)
newVector3Int(1, 0, 0)
newVector3Int(1, 1, 0)
newVector3Int(0, 1, 0)
newVector3Int(0, 0, 1)
newVector3Int(1, 0, 1)
newVector3Int(1, 1, 1)
newVector3Int(0, 1, 1)
global EdgeTable as Vector3[11,1]
global emptyVector3 as Vector3
global EdgeTable_i as integer = 0
addToEdgeTable( newVector3(0.0, 0.0, 0.0), newVector3(1.0, 0.0, 0.0) )
addToEdgeTable( newVector3(1.0, 0.0, 0.0), newVector3(1.0, 1.0, 0.0) )
addToEdgeTable( newVector3(0.0, 1.0, 0.0), newVector3(1.0, 1.0, 0.0) )
addToEdgeTable( newVector3(0.0, 0.0, 0.0), newVector3(0.0, 1.0, 0.0) )
addToEdgeTable( newVector3(0.0, 0.0, 1.0), newVector3(1.0, 0.0, 1.0) )
addToEdgeTable( newVector3(1.0, 0.0, 1.0), newVector3(1.0, 1.0, 1.0) )
addToEdgeTable( newVector3(0.0, 1.0, 1.0), newVector3(1.0, 1.0, 1.0) )
addToEdgeTable( newVector3(0.0, 0.0, 1.0), newVector3(0.0, 1.0, 1.0) )
addToEdgeTable( newVector3(0.0, 0.0, 0.0), newVector3(0.0, 0.0, 1.0) )
addToEdgeTable( newVector3(1.0, 0.0, 0.0), newVector3(1.0, 0.0, 1.0) )
addToEdgeTable( newVector3(1.0, 1.0, 0.0), newVector3(1.0, 1.0, 1.0) )
addToEdgeTable( newVector3(0.0, 1.0, 0.0), newVector3(0.0, 1.0, 1.0) )
global TriangleTable as integer[255,15]
global TriangleTable_i as integer = 0
addToTriangleTable(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1)
addToTriangleTable(8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1)
addToTriangleTable(3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1)
addToTriangleTable(4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1)
addToTriangleTable(4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1)
addToTriangleTable(9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1)
addToTriangleTable(10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1)
addToTriangleTable(5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1)
addToTriangleTable(5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1)
addToTriangleTable(8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1)
addToTriangleTable(2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1)
addToTriangleTable(2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1)
addToTriangleTable(11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1)
addToTriangleTable(5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1)
addToTriangleTable(11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1)
addToTriangleTable(11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1)
addToTriangleTable(2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1)
addToTriangleTable(6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1)
addToTriangleTable(3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1)
addToTriangleTable(6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1)
addToTriangleTable(6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1)
addToTriangleTable(8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1)
addToTriangleTable(7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1)
addToTriangleTable(3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1)
addToTriangleTable(9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1)
addToTriangleTable(8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1)
addToTriangleTable(5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1)
addToTriangleTable(0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1)
addToTriangleTable(6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1)
addToTriangleTable(10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1)
addToTriangleTable(1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1)
addToTriangleTable(0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1)
addToTriangleTable(3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1)
addToTriangleTable(6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1)
addToTriangleTable(9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1)
addToTriangleTable(8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1)
addToTriangleTable(3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1)
addToTriangleTable(10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1)
addToTriangleTable(10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1)
addToTriangleTable(2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1)
addToTriangleTable(7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1)
addToTriangleTable(2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1)
addToTriangleTable(1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1)
addToTriangleTable(11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1)
addToTriangleTable(8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1)
addToTriangleTable(0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1)
addToTriangleTable(7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1)
addToTriangleTable(7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1)
addToTriangleTable(10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1)
addToTriangleTable(0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1)
addToTriangleTable(7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1)
addToTriangleTable(6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1)
addToTriangleTable(4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1)
addToTriangleTable(10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1)
addToTriangleTable(8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1)
addToTriangleTable(1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1)
addToTriangleTable(10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1)
addToTriangleTable(10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1)
addToTriangleTable(9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1)
addToTriangleTable(7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1)
addToTriangleTable(3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1)
addToTriangleTable(7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1)
addToTriangleTable(3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1)
addToTriangleTable(6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1)
addToTriangleTable(9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1)
addToTriangleTable(1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1)
addToTriangleTable(4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1)
addToTriangleTable(7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1)
addToTriangleTable(6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1)
addToTriangleTable(0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1)
addToTriangleTable(6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1)
addToTriangleTable(0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1)
addToTriangleTable(11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1)
addToTriangleTable(6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1)
addToTriangleTable(5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1)
addToTriangleTable(9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1)
addToTriangleTable(1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1)
addToTriangleTable(10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1)
addToTriangleTable(0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1)
addToTriangleTable(11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1)
addToTriangleTable(9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1)
addToTriangleTable(7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1)
addToTriangleTable(2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1)
addToTriangleTable(9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1)
addToTriangleTable(9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1)
addToTriangleTable(1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1)
addToTriangleTable(0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1)
addToTriangleTable(10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1)
addToTriangleTable(2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1)
addToTriangleTable(0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1)
addToTriangleTable(0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1)
addToTriangleTable(9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1)
addToTriangleTable(5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1)
addToTriangleTable(5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1)
addToTriangleTable(8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1)
addToTriangleTable(9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1)
addToTriangleTable(1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1)
addToTriangleTable(3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1)
addToTriangleTable(4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1)
addToTriangleTable(9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1)
addToTriangleTable(11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1)
addToTriangleTable(2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1)
addToTriangleTable(9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1)
addToTriangleTable(3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1)
addToTriangleTable(1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1)
addToTriangleTable(4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1)
addToTriangleTable(0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1)
addToTriangleTable(1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
addToTriangleTable(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)
NoiseInit()
Start()
dd1 = CreateObjectBox(3,3,3)
SetObjectPosition(dd1, 5, 0, 5)
dd2 = CreateObjectBox(3,3,3)
SetObjectPosition(dd2, -5, 5, -5)
do
Print( ScreenFPS() )
Print( terrainMap[1,5,10] )
SP_ControlCamera()
Sync()
loop
end
type Vector3
x as float
y as float
z as float
endtype
type Vector3Int
x as integer
y as integer
z as integer
endtype
type cubeType
v as float[7]
endtype
function CreateMeshData()
x as integer
y as integer
z as integer
cube as cubeType
i as integer
corner as Vector3Int
curVector3 as Vector3
ClearMeshData()
//do
//MarchCube(..
//loop
// Loop through each "cube" in our terrain.
for x = 0 to arrw - 1
for y = 0 to arrh - 1
for z = 0 to arrz - 1
// Create an array of floats representing each corner of a cube and get the value from our terrainMap.
// was float[] cube = new float[8];
for i = 0 to 7
corner = addVector3Int(x,y,z, CornerTable[i])
cube.v[i] = terrainMap[corner.x, corner.y, corner.z]
next i
// Pass the value into our MarchCube function.
curVector3.x = x
curVector3.y = y
curVector3.z = z
MarchCube(curVector3, cube)
next z
next y
next x
BuildMesh()
endfunction
function addVector3Int(x,y,z, v1 as Vector3Int)
ret as Vector3Int
ret.x = x + v1.x
ret.y = y + v1.y
ret.z = z + v1.z
endfunction ret
function PopulateTerrainMap()
x as integer
y as integer
z as integer
thisHeight as float
point as float
//terrainMap[x, y, z] = ....
// The data points for terrain are stored at the corners of our "cubes", so the terrainMap needs to be 1 larger
// than the width/height of our mesh.
for x = 0 to arrw-1
for z = 0 to arrz-1
for y = 0 to arrh-1
// Get a terrain height using regular old Perlin noise.
thisHeight = height * Noise2D(x / 16.0 * 1.5 + 0.001, z / 16.0 * 1.5 + 0.001)
point = 0.0
// We're only interested when point is within 0.5f of terrain surface. More than 0.5f less and it is just considered
// solid terrain, more than 0.5f above and it is just air. Within that range, however, we want the exact value.
if (y <= thisHeight - 0.5)
point = 0.0
elseif (y > thisHeight + 0.5)
point = 1.0
elseif (y > thisHeight)
point = y - thisHeight
else
point = thisHeight - y
endif
// Set the value of this point in the terrainMap.
terrainMap[x, y, z] = point
next y
next z
next x
endfunction
function MarchCube(position as Vector3, cube as cubeType)
//vertices.Add..
//triangles.Add..
i as integer
p as integer
indice as integer
edgeIndex as integer
vert1 as Vector3
vert2 as Vector3
vertPosition as Vector3
// Get the configuration index of this cube.
configIndex as integer
configIndex = GetCubeConfiguration(cube)
// If the configuration of this cube is 0 or 255 (completely inside the terrain or completely outside of it) we don't need to do anything.
if (configIndex = 0 OR configIndex = 255)
exitfunction
endif
// Loop through the triangles. There are never more than 5 triangles to a cube and only three vertices to a triangle.
edgeIndex = 0
for i = 0 to 5
for p = 0 to 3
// Get the current indice. We increment triangleIndex through each loop.
indice = TriangleTable[configIndex, edgeIndex]
// If the current edgeIndex is -1, there are no more indices and we can exit the function.
if (indice = -1)
exitfunction
endif
// Get the vertices for the start and end of this edge.
vert1 = addVector3(position, EdgeTable[indice, 0])
vert2 = addVector3(position, EdgeTable[indice, 1])
// Get the midpoint of this edge.
vertPosition = divVector3(addVector3(vert1, vert2), 2.0)
// Add to our vertices and triangles list and incremement the edgeIndex.
vertices.insert(vertPosition)
triangles.insert(vertices.length) //was vertices.length - 1
edgeIndex = edgeIndex + 1
next p
next i
endfunction
function addVector3(v1 as Vector3, v2 as Vector3)
ret as Vector3
ret.x = v1.x + v2.x
ret.y = v1.y + v2.y
ret.z = v1.z + v2.z
endfunction ret
function divVector3(v1 as Vector3, divv as float)
ret as Vector3
ret.x = v1.x / divv
ret.y = v1.y / divv
ret.z = v1.z / divv
endfunction ret
function GetCubeConfiguration(cube as cubeType)
i as integer
//return cubeType
// Starting with a configuration of zero, loop through each point in the cube and check if it is below the terrain surface.
configurationIndex as integer = 0
for i = 0 to 7
// If it is, use bit-magic to the set the corresponding bit to 1. So if only the 3rd point in the cube was below
// the surface, the bit would look like 00100000, which represents the integer value 32.
if (cube.v[i] > terrainSurface)
//configurationIndex |= 1 << i
configurationIndex = configurationIndex || (%00000001 << i)
endif
next i
endfunction configurationIndex
function ClearMeshData()
vertices.length = 0
triangles.length = 0
endfunction
function BuildMesh()
Object as ObjectData
ObjectID as integer
vi as integer
ii as integer
X# as float
Y# as float
Z# as float
shid as integer
//Memblocks ...
//convert to voxel Object
for vi = 1 to vertices.length
Object.Vertex.insert(emptyVertexData)
X# = vertices[vi].x
Y# = vertices[vi].y
Z# = vertices[vi].z
Voxel_SetObjectFacePosition(Object.Vertex[Object.Vertex.length],X#,Y#,Z#)
Voxel_SetObjectFaceNormal(Object.Vertex[Object.Vertex.length],-1,0,0) //for test only
next vi
for ii = 0 to triangles.length-1
Object.Index.insert(triangles[ii])
next ii
ObjectID = Voxel_CreateObject(Object)
shid = LoadShader('vertex.vs', 'fragment.ps')
SetObjectPosition(ObjectID, 0,0,0)
SetObjectColor(ObjectID,255,255,255,255)
SetObjectShader(ObjectID, shid)
endfunction
function addToEdgeTable(v1 as Vector3, v2 as Vector3)
//insert to edge arr
EdgeTable[EdgeTable_i, 0] = v1
EdgeTable[EdgeTable_i, 1] = v2
EdgeTable_i = EdgeTable_i + 1
endfunction
function newVector3Int(x as integer,y as integer,z as integer)
//insert to CornerTable
CornerTable[CornerTable_i].x = x
CornerTable[CornerTable_i].y = y
CornerTable[CornerTable_i].z = z
CornerTable_i = CornerTable_i + 1
endfunction
function newVector3(x as float,y as float,z as float)
ret as Vector3
//return Vector3
ret.x = x
ret.y = y
ret.z = z
endfunction ret
function addToTriangleTable(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16)
i as integer = 0
//insert to TriangleTable
TriangleTable[TriangleTable_i,i] = i1
i = i + 1 : TriangleTable[TriangleTable_i,i] = i2
i = i + 1 : TriangleTable[TriangleTable_i,i] = i3
i = i + 1 : TriangleTable[TriangleTable_i,i] = i4
i = i + 1 : TriangleTable[TriangleTable_i,i] = i5
i = i + 1 : TriangleTable[TriangleTable_i,i] = i6
i = i + 1 : TriangleTable[TriangleTable_i,i] = i7
i = i + 1 : TriangleTable[TriangleTable_i,i] = i8
i = i + 1 : TriangleTable[TriangleTable_i,i] = i9
i = i + 1 : TriangleTable[TriangleTable_i,i] = i10
i = i + 1 : TriangleTable[TriangleTable_i,i] = i11
i = i + 1 : TriangleTable[TriangleTable_i,i] = i12
i = i + 1 : TriangleTable[TriangleTable_i,i] = i13
i = i + 1 : TriangleTable[TriangleTable_i,i] = i14
i = i + 1 : TriangleTable[TriangleTable_i,i] = i15
i = i + 1 : TriangleTable[TriangleTable_i,i] = i16
TriangleTable_i = TriangleTable_i + 1
endfunction
function Start()
PopulateTerrainMap()
CreateMeshData()
endfunction
// ***************************************************************************************************
// Ken Perlin's Simplex Noise 2D. AGK Version.
// Ported from Stefan Gustavson's Java implementation
// (http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf)
// 2015.02.03
// AGK reference https://forum.thegamecreators.com/thread/213532
// Thank you Thank you
#constant PN3DF2 = 0.5*(sqrt(3.0)-1.0)
#constant PN3DG2 = (3.0-sqrt(3.0))/6.0
Type sPNVECTOR
x as float
y as float
z as float
endtype
Global PNHash as integer[512]
Global PNGrad3 as sPNVECTOR[256]
Function NoiseInit()
Local n as integer, rn as integer
For n=0 To 255
PNHash[n] = n
Next n
For n=0 To 255
rn=Random(0, 255)
PNHash.swap(n,rn)
Next n
For n=0 To 255
PNHash[256 + n] = PNHash[n]
Next n
PNHash[511] = PNHash[0]
For n=0 To 15
PNGrad3[n * 16 + 0].x = 1 : PNGrad3[n * 16 + 0].y = 1 : PNGrad3[n * 16 + 0].z = 0
PNGrad3[n * 16 + 1].x = -1 : PNGrad3[n * 16 + 1].y = 1 : PNGrad3[n * 16 + 1].z = 0
PNGrad3[n * 16 + 2].x = 1 : PNGrad3[n * 16 + 2].y = -1 : PNGrad3[n * 16 + 2].z = 0
PNGrad3[n * 16 + 3].x = -1 : PNGrad3[n * 16 + 3].y = -1 : PNGrad3[n * 16 + 3].z = 0
PNGrad3[n * 16 + 4].x = 1 : PNGrad3[n * 16 + 4].y = 0 : PNGrad3[n * 16 + 4].z = 1
PNGrad3[n * 16 + 5].x = -1 : PNGrad3[n * 16 + 5].y = 0 : PNGrad3[n * 16 + 5].z = 1
PNGrad3[n * 16 + 6].x = 1 : PNGrad3[n * 16 + 6].y = 0 : PNGrad3[n * 16 + 6].z = -1
PNGrad3[n * 16 + 7].x = -1 : PNGrad3[n * 16 + 7].y = 0 : PNGrad3[n * 16 + 7].z = -1
PNGrad3[n * 16 + 8].x = 0 : PNGrad3[n * 16 + 8].y = 1 : PNGrad3[n * 16 + 8].z = 1
PNGrad3[n * 16 + 9].x = 0 : PNGrad3[n * 16 + 9].y = -1 : PNGrad3[n * 16 + 9].z = 1
PNGrad3[n * 16 + 10].x = 0 : PNGrad3[n * 16 + 10].y = 1 : PNGrad3[n * 16 + 10].z = -1
PNGrad3[n * 16 + 11].x = 0 : PNGrad3[n * 16 + 11].y = -1 : PNGrad3[n * 16 + 11].z = -1
PNGrad3[n * 16 + 12].x = 1 : PNGrad3[n * 16 + 12].y = 1 : PNGrad3[n * 16 + 12].z = 0
PNGrad3[n * 16 + 13].x = -1 : PNGrad3[n * 16 + 13].y = 1 : PNGrad3[n * 16 + 13].z = 0
PNGrad3[n * 16 + 14].x = 0 : PNGrad3[n * 16 + 14].y = -1 : PNGrad3[n * 16 + 14].z = 1
PNGrad3[n * 16 + 15].x = 0 : PNGrad3[n * 16 + 15].y = -1 : PNGrad3[n * 16 + 15].z = -1
Next n
endfunction
function Noise2D(xin as float, yin as float)
local n0 as float, n1 as float, n2 as float, s as float, t as float, x0 as float, y0 as float, xs as float, ys as float
local i as integer, j as integer, i1 as integer, j1 as integer, i2 as integer, j2 as integer, gi0 as integer, gi1 as integer, gi2 as integer
local x1 as float, y1 as float, x2 as float, y2 as float, x3 as float, y3 as float, t0 as float, t1 as float, t2 as float
s = (xin + yin) * PN3DF2
xs = xin + s
i = floor(xs)
ys = yin + s
j = floor(ys)
t = (i + j) * PN3DG2
x0 = xin - (i - t)
y0 = yin - (j - t)
if x0>y0
i1=1
j1=0
else
i1=0
j1=1
endif
x1 = x0 - i1 + PN3DG2
y1 = y0 - j1 + PN3DG2
x2 = x0 - 1.0 + 2.0 * PN3DG2
y2 = y0 - 1.0 + 2.0 * PN3DG2
i = i && 255
j = j && 255
gi0 = PNHash[i + PNHash[j]] && 15
gi1 = PNHash[i + i1 + PNHash[j + j1]] && 15
gi2 = PNHash[i + 1 + PNHash[j+ 1]] && 15
t0 = 0.5 - x0*x0-y0*y0
if t0<0
n0 = 0.0
else
t0 = t0 * t0
n0 = t0 * t0 * (PNGrad3[gi0].x * x0 + PNGrad3[gi0].y * y0)
endif
t1 = 0.5 - x1*x1-y1*y1
if t1<0
n1 = 0.0
else
t1 = t1 * t1
n1 = t1 * t1 * (PNGrad3[gi1].x * x1 + PNGrad3[gi1].y * y1)
endif
t2 = 0.5 - x2*x2-y2*y2
if t2<0
n2 = 0.0
else
t2 = t2 * t2
n2 = t2 * t2 * (PNGrad3[gi2].x * x2 + PNGrad3[gi2].y * y2)
endif
endfunction 30*(n0 + n1 + n2)
// Mesh -------------------------------------------------------------
// from Voxel Engine
// Data Types able to represent any AGK mesh
type Vec4Data
X#
Y#
Z#
W#
endtype
type Vec3Data
X#
Y#
Z#
endtype
type Vec2Data
X#
Y#
endtype
type RGBAData
Red#
Green#
Blue#
Alpha#
endtype
type VertexData
Pos as Vec3Data
UV as Vec2Data
Color as RGBAData
Normal as Vec3Data
Tangent as Vec3Data
Bitangent as Vec3Data
endtype
type ObjectData
Vertex as VertexData[]
Index as integer[]
endtype
/*
#constant FaceFront 1
#constant FaceBack 2
#constant FaceLeft 3
#constant FaceRight 4
#constant FaceUp 5
#constant FaceDown 6
type WorldData
Terrain as TerrainData[0,0,0]
Chunk as ChunkData[0,0,0]
endtype
type TerrainData
BlockType as integer
LightValue as integer
endtype
type SubimageData
X as integer
Y as integer
Width as integer
Height as integer
endtype
type FaceIndexData
FrontID as integer
BackID as integer
UpID as integer
DownID as integer
LeftID as integer
RightID as integer
endtype
type FaceimageData
Subimages as SubimageData[]
FaceimageIndices as FaceIndexData[]
endtype*/
type Int3Data
X as integer
Y as integer
Z as integer
endtype
/*type BorderData
Min as Int3Data
Max as Int3Data
endtype
type ChunkData
Border as BorderData
ObjectID as integer
Visible as integer
endtype
type MemblockData
GrassMemblockID as integer
CaveMemblockID as integer
IronMemblockID as integer
endtype*/
global emptyVertexData as VertexData
function Voxel_CreateObject(Object as ObjectData)
MemblockID as integer
ObjectID as integer
MemblockID=Voxel_CreateMeshMemblock(Object.Vertex.length+1,Object.Index.length+1)
Voxel_WriteMeshMemblock(MemblockID,Object)
ObjectID=CreateObjectFromMeshMemblock(MemblockID)
DeleteMemblock(MemblockID)
endfunction ObjectID
function Voxel_SetObjectFacePosition(Vertex ref as VertexData,X#,Y#,Z#)
Vertex.Pos.X#=X#
Vertex.Pos.Y#=Y#
Vertex.Pos.Z#=Z#
endfunction
function Voxel_SetObjectFaceNormal(Vertex ref as VertexData,X#,Y#,Z#)
Vertex.Normal.X#=X#
Vertex.Normal.Y#=Y#
Vertex.Normal.Z#=Z#
endfunction
function Voxel_SetObjectFaceUV(Vertex ref as VertexData,U#,V#)
Vertex.UV.X#=U#
Vertex.UV.Y#=V#
endfunction
function Voxel_SetObjectFaceColor(Vertex ref as VertexData,Red,Green,Blue,Alpha)
Vertex.Color.Red#=Red/255.0
Vertex.Color.Green#=Green/255.0
Vertex.Color.Blue#=Blue/255.0
Vertex.Color.Alpha#=Alpha/255.0
endfunction
function Voxel_SetObjectFaceTangent(Vertex ref as VertexData,X#,Y#,Z#)
Vertex.Tangent.X#=X#
Vertex.Tangent.Y#=Y#
Vertex.Tangent.Z#=Z#
endfunction
function Voxel_SetObjectFaceBitangent(Vertex ref as VertexData,X#,Y#,Z#)
Vertex.Bitangent.X#=X#
Vertex.Bitangent.Y#=Y#
Vertex.Bitangent.Z#=Z#
endfunction
// Generate the mesh header for a simple one sided plane
// Position,Normal,UV,Color,Tangent and Bitangent Data
function Voxel_CreateMeshMemblock(VertexCount,IndexCount)
Attributes=6
VertexSize=60
VertexSize=3*4+3*4+2*4+4*1+3*4+3*4
VertexOffset=100
IndexOffset=VertexOffset+(VertexCount*VertexSize)
MemblockID=Creatememblock(IndexOffset+(IndexCount*4))
SetMemblockInt(MemblockID,0,VertexCount)
SetMemblockInt(MemblockID,4,IndexCount)
SetMemblockInt(MemblockID,8,Attributes)
SetMemblockInt(MemblockID,12,VertexSize)
SetMemblockInt(MemblockID,16,VertexOffset)
SetMemblockInt(MemblockID,20,IndexOffset)
SetMemblockByte(MemblockID,24,0)
SetMemblockByte(MemblockID,24+1,3)
SetMemblockByte(MemblockID,24+2,0)
SetMemblockByte(MemblockID,24+3,12)
SetMemblockString(MemblockID,24+4,"position"+chr(0))
SetMemblockByte(MemblockID,40,0)
SetMemblockByte(MemblockID,40+1,3)
SetMemblockByte(MemblockID,40+2,0)
SetMemblockByte(MemblockID,40+3,8)
SetMemblockString(MemblockID,40+4,"normal"+chr(0))
SetMemblockByte(MemblockID,52,0)
SetMemblockByte(MemblockID,52+1,2)
SetMemblockByte(MemblockID,52+2,0)
SetMemblockByte(MemblockID,52+3,4)
SetMemblockString(MemblockID,52+4,"uv"+chr(0))
SetMemblockByte(MemblockID,60,1)
SetMemblockByte(MemblockID,60+1,4)
SetMemblockByte(MemblockID,60+2,1)
SetMemblockByte(MemblockID,60+3,8)
SetMemblockString(MemblockID,60+4,"color"+chr(0))
SetMemblockByte(MemblockID,72,0)
SetMemblockByte(MemblockID,72+1,3)
SetMemblockByte(MemblockID,72+2,0)
SetMemblockByte(MemblockID,72+3,8)
SetMemblockString(MemblockID,72+4,"tangent"+chr(0))
SetMemblockByte(MemblockID,84,0)
SetMemblockByte(MemblockID,84+1,3)
SetMemblockByte(MemblockID,84+2,0)
SetMemblockByte(MemblockID,84+3,12)
SetMemblockString(MemblockID,84+4,"bitangent"+chr(0))
endfunction MemblockID
function Voxel_WriteMeshMemblock(MemblockID,Object ref as ObjectData)
VertexCount=Object.Vertex.length+1
VertexSize=60
VertexSize=3*4+3*4+2*4+4*1+3*4+3*4
VertexOffset=100
IndexOffset=VertexOffset+(VertexCount*VertexSize)
TangentOffset=3*4+3*4+2*4+4*1
BitangentOffset=3*4+3*4+2*4+4*1+3*4
for VertexID=0 to Object.Vertex.length
Offset=VertexOffset+(VertexID*VertexSize)
SetMeshMemblockVertexPosition(MemblockID,VertexID,Object.Vertex[VertexID].Pos.X#,Object.Vertex[VertexID].Pos.Y#,Object.Vertex[VertexID].Pos.Z#)
SetMeshMemblockVertexNormal(MemblockID,VertexID,Object.Vertex[VertexID].Normal.X#,Object.Vertex[VertexID].Normal.Y#,Object.Vertex[VertexID].Normal.Z#)
SetMeshMemblockVertexUV(MemblockID,VertexID,Object.Vertex[VertexID].UV.X#,Object.Vertex[VertexID].UV.Y#)
SetMeshMemblockVertexColor(MemblockID,VertexID,Object.Vertex[VertexID].Color.Red#*255,Object.Vertex[VertexID].Color.Green#*255,Object.Vertex[VertexID].Color.Blue#*255,Object.Vertex[VertexID].Color.Alpha#*255)
Offset=VertexOffset+(VertexID*VertexSize)+TangentOffset
Voxel_SetMemblockVec3(MemblockID,Offset,Object.Vertex[VertexID].Tangent.X#,Object.Vertex[VertexID].Tangent.Y#,Object.Vertex[VertexID].Tangent.Z#)
Offset=VertexOffset+(VertexID*VertexSize)+BitangentOffset
Voxel_SetMemblockVec3(MemblockID,Offset,Object.Vertex[VertexID].Bitangent.X#,Object.Vertex[VertexID].Bitangent.Y#,Object.Vertex[VertexID].Bitangent.Z#)
next VertexID
for IndexID=0 to Object.Index.length
Offset=IndexOffset+IndexID*4
SetMemblockInt(MemblockID,Offset,Object.Index[IndexID])
next IndexID
endfunction
// just print the mesh header
function Voxel_PrintMeshMemblock(MemblockID)
local VertexCount as integer
local IndexCount as integer
local Attributes as integer
local VertexSize as integer
local VertexOffset as integer
local IndexOffset as integer
local AttributeOffset as integer
local ID as integer
local Stringlength as integer
VertexCount=GetMemblockInt(MemblockID,0)
IndexCount=GetMemblockInt(MemblockID,4)
Attributes=GetMemblockInt(MemblockID,8)
VertexSize=GetMemblockInt(MemblockID,12)
VertexOffset=GetMemblockInt(MemblockID,16)
IndexOffset=GetMemblockInt(MemblockID,20)
AttributeOffset=24
message("VertexCount: "+str(VertexCount)+chr(10)+"IndexCount: "+str(IndexCount)+chr(10)+"Attributes: "+str(Attributes)+chr(10)+"VertexSize: "+str(VertexSize)+chr(10)+"VertexOffset: "+str(VertexOffset)+chr(10)+"IndexOffset: "+str(IndexOffset))
for ID=1 to Attributes
Stringlength=GetMemblockByte(MemblockID,AttributeOffset+3) // string length
message("type: "+str(GetMemblockByte(MemblockID,AttributeOffset))+chr(10)+"components: "+str(GetMemblockByte(MemblockID,AttributeOffset+1))+chr(10)+"normalize: "+str(GetMemblockByte(MemblockID,AttributeOffset+2))+chr(10)+"length: "+str(Stringlength)+chr(10)+"string: "+GetMemblockString(MemblockID,AttributeOffset+4,Stringlength)) // string
inc AttributeOffset,4+StringLength
next
endfunction
function Voxel_SetMemblockVec4(MemblockID,Offset,x#,y#,z#,w#)
SetMemblockFloat(MemblockID,Offset,x#)
SetMemblockFloat(MemblockID,Offset+4,y#)
SetMemblockFloat(MemblockID,Offset+8,z#)
SetMemblockFloat(MemblockID,Offset+12,w#)
endfunction
function Voxel_SetMemblockVec3(MemblockID,Offset,x#,y#,z#)
SetMemblockFloat(MemblockID,Offset,x#)
SetMemblockFloat(MemblockID,Offset+4,y#)
SetMemblockFloat(MemblockID,Offset+8,z#)
endfunction
function Voxel_SetMemblockVec2(MemblockID,Offset,u#,v#)
SetMemblockFloat(MemblockID,Offset,u#)
SetMemblockFloat(MemblockID,Offset+4,v#)
endfunction
function Voxel_SetMemblockByte4(MemblockID,Offset,r,g,b,a)
SetMemblockByte(MemblockID,Offset,r)
SetMemblockByte(MemblockID,Offset+1,g)
SetMemblockByte(MemblockID,Offset+2,b)
SetMemblockByte(MemblockID,Offset+3,a)
endfunction
function Voxel_SetMemblockInt4(MemblockID,Offset,x#,y#,z#,w#)
SetMemblockInt(MemblockID,Offset,x#)
SetMemblockInt(MemblockID,Offset+4,y#)
SetMemblockInt(MemblockID,Offset+8,z#)
SetMemblockInt(MemblockID,Offset+12,w#)
endfunction
function Voxel_Clamp(Value#,Min#,Max#)
if Min#>Max# then exitfunction Value#
if Value#>Max# then Value#=Max#
if Value#<Min# then Value#=Min#
endfunction Value#
// Camera
/******************/
/* Dont mind this */
/******************/
function SP_ControlCamera()
#constant KEY_ESC 27
#constant KEY_PAGEUP 33
#constant KEY_PAGEDOWN 34
#constant KEY_LEFT 37
#constant KEY_UP 38
#constant KEY_RIGHT 39
#constant KEY_DOWN 40
#constant KEY_END 35
#constant KEY_HOME 36
#constant KEY_SHIFT 16
#constant KEY_S 83
local speed# as float
local JoystickSize# as float
global CameraAngleNewX# as float
global CameraAngleNewY# as float
global PointerX# as float
global PointerY# as float
global PointerStartX# as float
global PointerStartY# as float
global PointerDragX# as float
global PointerDragY# as float
global CameraAngleX# as float
global CameraAngleY# as float
global VelocityZ# as float
global VelocityX# as float
global VelocityY# as float
speed#=20*GetFrameTime()
if GetRawKeyState(KEY_SHIFT) then speed#=50*GetFrameTime()
VelocityZ#=SP_CurveValue(VelocityZ#,0,10.0)
VelocityX#=SP_CurveValue(VelocityX#,0,10.0)
VelocityY#=SP_CurveValue(VelocityY#,0,10.0)
// move the camera with keys
if GetKeyboardExists()=1
if(GetRawKeyState(87)) then VelocityZ#=SP_CurveValue(VelocityZ#,speed#,10.0)
if(GetRawKeyState(83)) then VelocityZ#=SP_CurveValue(VelocityZ#,-speed#,10.0)
if(GetRawKeyState(65)) then VelocityX#=SP_CurveValue(VelocityX#,-speed#,10.0)
if(GetRawKeyState(68)) then VelocityX#=SP_CurveValue(VelocityX#,speed#,10.0)
if(GetRawKeyState(81)) then VelocityY#=SP_CurveValue(VelocityY#,-speed#,10.0)
if(GetRawKeyState(69)) then VelocityY#=SP_CurveValue(VelocityY#,speed#,10.0)
else
JoystickSize#=GetVirtualHeight()*0.25
SetJoystickScreenPosition(GetScreenBoundsLeft()+JoystickSize#*0.5,GetScreenBoundsBottom()-JoystickSize#*0.5,JoystickSize#)
MoveCameraLocalZ( 1, -GetJoystickY() * speed# )
MoveCameraLocalX( 1, GetJoystickX() * speed# )
endif
MoveCameraLocalZ(1, VelocityZ# )
MoveCameraLocalX(1, VelocityX# )
MoveCameraLocalY(1, VelocityY# )
// rotate the camera
PointerX#=GetPointerX()
PointerY#=GetPointerY()
if GetPointerPressed()=1
PointerStartX#=PointerX#
PointerStartY#=PointerY#
CameraAngleX#=GetCameraAngleX(1)
CameraAngleY#=GetCameraAngleY(1)
endif
if GetPointerState()=1
PointerDragX#=(PointerX#-PointerStartX#)
PointerDragY#=(PointerY#-PointerStartY#)
endif
CameraAngleNewX#=SP_CurveAngle(CameraAngleNewX#,CameraAngleX#+PointerDragY#,7.0)
CameraAngleNewY#=SP_CurveAngle(CameraAngleNewY#,CameraAngleY#+PointerDragX#,7.0)
SetCameraRotation(1,CameraAngleNewX#,CameraAngleNewY#,0)
endfunction
function SP_CurveValue(current# as float, destination# as float, speed# as float)
local diff# as float
if speed# < 1.0 then speed# = 1.0
diff# = destination# - current#
current# = current# + ( diff# / speed# )
endfunction current#
function SP_CurveAngle(current# as float, destination# as float, speed# as float)
local diff# as float
if speed# < 1.0 then speed# = 1.0
destination# = SP_WrapAngle( destination# )
current# = SP_WrapAngle( current# )
diff# = destination# - current#
if diff# <- 180.0 then diff# = ( destination# + 360.0 ) - current#
if diff# > 180.0 then diff# = destination# - ( current# + 360.0 )
current# = current# + ( diff# / speed# )
current# = SP_WrapAngle( current# )
endfunction current#
function SP_WrapAngle( angle# as float)
local iChunkOut as integer
local breakout as integer
iChunkOut = angle#
iChunkOut = iChunkOut - mod( iChunkOut, 360 )
angle# = angle# - iChunkOut
breakout = 10000
while angle# < 0.0 or angle# >= 360.0
if angle# < 0.0 then angle# = angle# + 360.0
if angle# >= 360.0 then angle# = angle# - 360.0
dec breakout
if breakout = 0 then exit
endwhile
if breakout = 0 then angle# = 0.0
endfunction angle#