@Weeping Corpse - When it comes to parsing and recognising OO in the syntax, FreeBasic has a lot of it sussed but not as complete as C++ yet. Here's a snippet from something I started to proto-type some code in FB to test out on both Windows and Linux -
' include file for procmapfb using freebasic types
type vert
as single x, y
end type
type edge
as integer v1, v2
end type
type face
as integer v1, v2, v3
end type
type segment
as vert ptr verts
as edge ptr edges
as face ptr faces
as integer verts_size, edges_size, faces_size
declare constructor()
declare destructor()
declare function addvert( byval xpos as single, _
byval ypos as single ) as integer
declare sub remvert( byval index as integer )
declare function addedge( byval v1 as integer, _
byval v2 as integer ) as integer
declare sub remedge( byval index as integer )
declare function addface( byval v1 as integer, _
byval v2 as integer, _
byval v3 as integer ) as integer
declare sub remface( byval index as integer )
end type
constructor segment()
verts_size = 0
edges_size = 0
faces_size = 0
verts = 0
edges = 0
faces = 0
end constructor
destructor segment()
if verts then deallocate(verts)
if edges then deallocate(edges)
if faces then deallocate(faces)
end destructor
function segment.addvert( byval xpos as single, _
byval ypos as single ) as integer
if ( verts_size = 0 ) then
verts_size = 1
verts = callocate( sizeof(vert) )
else
verts_size += 1
verts = reallocate( verts, sizeof(vert) * verts_size )
end if
verts[verts_size-1].x = xpos
verts[verts_size-1].y = ypos
return verts_size
end function
sub segment.remvert( byval index as integer )
if ( index > ( verts_size - 1 ) ) then return
dim current as integer = index
' shift vert positions down one
while ( current < ( verts_size - 2 ) )
verts[current].x = verts[current+1].x
verts[current].y = verts[current+1].y
current += 1
wend
verts_size -= 1
if ( verts_size = 0 ) then
deallocate( verts )
else
verts = reallocate( verts, sizeof(vert) * verts_size )
end if
end sub
function segment.addedge( byval v1 as integer, _
byval v2 as integer ) as integer
if ( edges_size = 0 ) then
edges_size = 1
edges = callocate( sizeof(edge) )
else
edges_size += 1
edges = reallocate( edges, sizeof(edge) * edges_size )
end if
edges[edges_size-1].v1 = v1
edges[edges_size-1].v2 = v2
return edges_size
end function
sub segment.remedge( byval index as integer )
if ( index > ( edges_size - 1 ) ) then return
dim current as integer = index
' shift edges down one in the array
while ( current < ( edges_size - 2 ) )
edges[current].v1 = edges[current+1].v1
edges[current].v2 = edges[current+1].v2
current += 1
wend
edges_size -= 1
if ( edges_size = 0 ) then
deallocate( edges )
else
edges = reallocate( edges, sizeof(edge) * edges_size )
end if
end sub
function segment.addface( byval v1 as integer, _
byval v2 as integer, _
byval v3 as integer ) as integer
if ( faces_size = 0 ) then
faces_size = 1
faces = callocate( sizeof(face) )
else
faces_size += 1
faces = reallocate( faces, sizeof(face) * faces_size )
end if
dim current as integer = faces_size - 1
faces[current].v1 = v1
faces[current].v2 = v2
faces[current].v3 = v3
return faces_size
end function
sub segment.remface( byval index as integer )
if ( index > ( faces_size - 1 ) ) then return
dim current as integer = index
while ( current < ( faces_size - 2 ) )
faces[current].v1 = faces[current+1].v1
faces[current].v2 = faces[current+1].v2
faces[current].v3 = faces[current+1].v3
current += 1
wend
faces_size -= 1
if ( faces_size = 0 ) then
deallocate( faces )
else
faces = reallocate( faces, sizeof(face) * faces_size )
end if
end sub
As you can see you can implement methods to TYPE's in FreeBasic. Something that is pretty hard to do in other Basic languages apart from Visual Basic. But then again FB is free...
EDIT: I forgot to mention again, FB does not have a 3D engine behind it though, only wrappers that are provided by other users. But it is cross-platform...
Mental arithmetic? Me? (That's for computers) I can't subtract a fart from a plate of beans!
Warning! May contain Nuts!