Hi WLGfx,i had a very similar idea to yours a while ago,didnt realise at the start of this thread that this was were you were heading with it.Good job with the GDK version,ive been trying to use it more myself recently but just end up trying things in DBPro first and never get round to porting them accross.
Anyway your post above reminded me of mine so i dug out the code from my old laptop and grabbed a couple of screen shots.I think im using a completely different method to yours for the map generation,but the effect is very similar.

code needs 3 textures to work
`%walking triangle test%
`======================
`©P.Parkinson
`======================
`Main Source File
`*********************************
`enviroment set up
IF CHECK DISPLAY MODE(1024,768,32)
SET DISPLAY MODE 1024,768,32
h=DESKTOP HEIGHT()
w=DESKTOP WIDTH()
posx=w/2-512
posy=h/2-384
ELSE
SET DISPLAY MODE 640,480,32
h=DESKTOP HEIGHT()
w=DESKTOP WIDTH()
posx=w/2-320
posy=h/2-240
ENDIF
SET WINDOW POSITION posx,posy
SYNC ON
SYNC RATE 0
AUTOCAM OFF
HIDE MOUSE
COLOR BACKDROP 0,0
SET TEXT FONT "Arial"
SET TEXT SIZE 12
SET TEXT TRANSPARENT
POSITION CAMERA 0,300,0
POINT CAMERA 0,0,0
POSITION MOUSE SCREEN WIDTH()/2,SCREEN HEIGHT()/2
dummy=MOUSEMOVEX()
dummy=MOUSEMOVEY()
SYNC
D3D_INIT
RANDOMIZE (TIMER())
``use your own textures for testing
LOAD IMAGE "floor.jpg",1
load image "ceiling.jpg",2
LOAD IMAGE "wall.jpg",3
`*********************************
`declarations and setup starts here
``vectors for collision detection
GLOBAL point1 AS INTEGER=1
GLOBAL point2 AS INTEGER=2
GLOBAL point3 AS INTEGER=3
GLOBAL point4 AS INTEGER=4
GLOBAL result1 AS INTEGER=5
GLOBAL result2 AS INTEGER=6
GLOBAL result3 AS INTEGER=7
GLOBAL result4 AS INTEGER=8
GLOBAL result5 AS INTEGER=9
GLOBAL result6 AS INTEGER=10
dummy=MAKE VECTOR3(point1)
dummy=MAKE VECTOR3(point2)
dummy=MAKE VECTOR3(point3)
dummy=MAKE VECTOR3(point4)
dummy=MAKE VECTOR3(result1)
dummy=MAKE VECTOR3(result2)
dummy=MAKE VECTOR3(result3)
dummy=MAKE VECTOR3(result4)
dummy=MAKE VECTOR3(result5)
dummy=MAKE VECTOR3(result6)
TYPE triangle
ax AS FLOAT
az AS FLOAT
bx AS FLOAT
bz AS FLOAT
cx AS FLOAT
cz AS FLOAT
ab_used AS INTEGER
bc_used AS INTEGER
ca_used AS INTEGER
ENDTYPE
TYPE intersect
ab_x AS FLOAT
ab_z AS FLOAT
ab_dist AS FLOAT
bc_x AS FLOAT
bc_z AS FLOAT
bc_dist AS FLOAT
ca_x AS FLOAT
ca_z AS FLOAT
ca_dist AS FLOAT
ENDTYPE
GLOBAL triangle_size AS FLOAT:triangle_size=50.0
GLOBAL max_triangles AS INTEGER=250
GLOBAL current_triangle AS INTEGER=1
DIM triangle_data(max_triangles) AS triangle
DIM new_triangle_data(1) AS triangle
DIM intersect_data(1) AS intersect
GLOBAL triangle_to_use AS INTEGER
``make intersection markers
GLOBAL dummy_ab AS INTEGER=10001
GLOBAL dummy_bc AS INTEGER=10002
GLOBAL dummy_ca AS INTEGER=10003
MAKE OBJECT BOX dummy_ab,1,1,1
MAKE OBJECT BOX dummy_bc,1,1,1
MAKE OBJECT BOX dummy_ca,1,1,1
COLOR OBJECT dummy_ab,RGB(255,0,0)
COLOR OBJECT dummy_bc,RGB(0,255,0)
COLOR OBJECT dummy_ca,RGB(0,0,255)
``make initial triangle
make_new_triangle()
copy_new_to_triangle_list()
MAKE OBJECT TRIANGLE current_triangle,triangle_data(current_triangle).ax,0,triangle_data(current_triangle).az,triangle_data(current_triangle).bx,0,triangle_data(current_triangle).bz,triangle_data(current_triangle).cx,0,triangle_data(current_triangle).cz
SET OBJECT WIREFRAME current_triangle,1
SYNC
//`make a series of start points
//DO
// make_new_triangle()
// move_triangle()
// D3D_LINE3D new_triangle_data(1).ax,0.0,new_triangle_data(1).az,new_triangle_data(1).bx,0.0,new_triangle_data(1).bz,RGB(255,0,0),1
// D3D_LINE3D new_triangle_data(1).bx,0.0,new_triangle_data(1).bz,new_triangle_data(1).cx,0.0,new_triangle_data(1).cz,RGB(0,255,0),1
// D3D_LINE3D new_triangle_data(1).cx,0.0,new_triangle_data(1).cz,new_triangle_data(1).ax,0.0,new_triangle_data(1).az,RGB(0,0,255),0
//
// IF check_if_valid()=0
// INC current_triangle
// copy_new_to_triangle_list()
// MAKE OBJECT TRIANGLE current_triangle,triangle_data(current_triangle).ax,0,triangle_data(current_triangle).az,triangle_data(current_triangle).bx,0,triangle_data(current_triangle).bz,triangle_data(current_triangle).cx,0,triangle_data(current_triangle).cz
// SET OBJECT WIREFRAME current_triangle,1
// ENDIF
// mouse_control(1.0)
// TEXT 0,0,STR$(current_triangle)
// SYNC
// IF current_triangle=20 OR SPACEKEY() THEN EXIT
//LOOP
``make remainder of triangles
DO
side_used=make_next_triangle()
D3D_LINE3D new_triangle_data(1).ax,0.0,new_triangle_data(1).az,new_triangle_data(1).bx,0.0,new_triangle_data(1).bz,RGB(255,0,0),1
D3D_LINE3D new_triangle_data(1).bx,0.0,new_triangle_data(1).bz,new_triangle_data(1).cx,0.0,new_triangle_data(1).cz,RGB(0,255,0),1
D3D_LINE3D new_triangle_data(1).cx,0.0,new_triangle_data(1).cz,new_triangle_data(1).ax,0.0,new_triangle_data(1).az,RGB(0,0,255),0
IF check_if_valid()=0
make_intersection_points()
INC current_triangle
copy_new_to_triangle_list()
MAKE OBJECT TRIANGLE current_triangle,triangle_data(current_triangle).ax,0,triangle_data(current_triangle).az,triangle_data(current_triangle).bx,0,triangle_data(current_triangle).bz,triangle_data(current_triangle).cx,0,triangle_data(current_triangle).cz
SET OBJECT WIREFRAME current_triangle,1
triangle_data(current_triangle).ca_used=1
SELECT side_used
CASE 0
triangle_data(triangle_to_use).ab_used=1
ENDCASE
CASE 1
triangle_data(triangle_to_use).bc_used=1
ENDCASE
CASE 2
triangle_data(triangle_to_use).ca_used=1
ENDCASE
ENDSELECT
ENDIF
mouse_control(1.0)
TEXT 0,0,"map genertion -"+STR$(current_triangle)+" out of "+str$(max_triangles)
IF INKEY$()="p"
IF IMAGE EXIST(4)
DELETE IMAGE 4
ENDIF
GET IMAGE 4,0,0,1024,768
SAVE IMAGE "generation.jpg",4
ENDIF
SYNC
// WAIT KEY
// WAIT 50
IF current_triangle=max_triangles OR SPACEKEY() THEN EXIT
LOOP
turn_data_into_map()
SYNC RATE 60
POSITION CAMERA 0,0,0
POINT CAMERA 0,0,0
`*********************************
`main loop starts here
MAKE LIGHT 1
SET AMBIENT LIGHT 0
DO
IF INKEY$()="p"
IF IMAGE EXIST(4)
DELETE IMAGE 4
ENDIF
GET IMAGE 4,0,0,1024,768
SAVE IMAGE "level.jpg",4
ENDIF
mouse_control(1.0)
SYNC
LOOP
`*********************************
`functions start here
FUNCTION mouse_control(speed AS FLOAT)
XROTATE CAMERA CAMERA ANGLE X()+MOUSEMOVEY()
YROTATE CAMERA CAMERA ANGLE Y()+MOUSEMOVEX()
IF MOUSECLICK()=1 THEN MOVE CAMERA speed
IF MOUSECLICK()=2 THEN MOVE CAMERA (0-speed)
dummy=MOUSEMOVEX()
dummy=MOUSEMOVEY()
ENDFUNCTION
FUNCTION point_in_triangle(px#,pz#,tri_x1#,tri_z1#,tri_x2#,tri_z2#,tri_x3#,tri_z3#)
ret=0
SET VECTOR3 point1,px#,0.0,pz#
SET VECTOR3 point2,tri_x1#,0.0,tri_z1#
SET VECTOR3 point3,tri_x2#,0.0,tri_z2#
SET VECTOR3 point4,tri_x3#,0.0,tri_z3#
IF same_side(point1,point2,point3,point4) AND same_side(point1,point3,point2,point4) AND same_side(point1,point4,point2,point3)
ret=1
ENDIF
ENDFUNCTION ret
FUNCTION same_side(p1,p2,a,b)
ret=0
SUBTRACT VECTOR3 result1,b,a
SUBTRACT VECTOR3 result2,p1,a
CROSS PRODUCT VECTOR3 result3,result1,result2
SUBTRACT VECTOR3 result4,b,a
SUBTRACT VECTOR3 result5,p2,a
CROSS PRODUCT VECTOR3 result6,result4,result5
IF DOT PRODUCT VECTOR3(result3,result6)>=0.1 THEN ret=1
ENDFUNCTION ret
FUNCTION make_new_triangle
new_triangle_data(1).ax=RND(triangle_size/2.0)*-1.0-1.0
new_triangle_data(1).az=RND(triangle_size/2.0)*-1.0-1.0
new_triangle_data(1).bx=0.0
new_triangle_data(1).bz=RND(triangle_size/2.0)+1.0
new_triangle_data(1).cx=RND(triangle_size/2.0)+1.0
new_triangle_data(1).cz=RND(triangle_size/2.0)*-1.0-1.0
make_intersection_points()
ENDFUNCTION
FUNCTION move_triangle()
x#=RND(300.0)-150.0
z#=RND(300.0)-150.0
new_triangle_data(1).ax=new_triangle_data(1).ax+x#
new_triangle_data(1).az=new_triangle_data(1).az+z#
new_triangle_data(1).bx=new_triangle_data(1).bx+x#
new_triangle_data(1).bz=new_triangle_data(1).bz+z#
new_triangle_data(1).cx=new_triangle_data(1).cx+x#
new_triangle_data(1).cz=new_triangle_data(1).cz+z#
ENDFUNCTION
FUNCTION copy_new_to_triangle_list()
triangle_data(current_triangle).ax=new_triangle_data(1).ax
triangle_data(current_triangle).az=new_triangle_data(1).az
triangle_data(current_triangle).bx=new_triangle_data(1).bx
triangle_data(current_triangle).bz=new_triangle_data(1).bz
triangle_data(current_triangle).cx=new_triangle_data(1).cx
triangle_data(current_triangle).cz=new_triangle_data(1).cz
ENDFUNCTION
FUNCTION check_if_valid()
test=0
FOR l=1 TO current_triangle
INC test,point_in_triangle(new_triangle_data(1).ax,new_triangle_data(1).az,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
INC test,point_in_triangle(new_triangle_data(1).bx,new_triangle_data(1).bz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
INC test,point_in_triangle(new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
INC test,point_in_triangle(triangle_data(l).ax,triangle_data(l).az,new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
INC test,point_in_triangle(triangle_data(l).bx,triangle_data(l).bz,new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
INC test,point_in_triangle(triangle_data(l).cx,triangle_data(l).cz,new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
``ab to ab
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz)
``ab to ac
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).cx,triangle_data(l).cz)
``ab to bc
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
``ac to ab
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz)
``ac to ac
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).cx,triangle_data(l).cz)
``ac to bc
INC test,line_intersect(new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
``bc to ab
INC test,line_intersect(new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).bx,triangle_data(l).bz)
``bc to ac
INC test,line_intersect(new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).ax,triangle_data(l).az,triangle_data(l).cx,triangle_data(l).cz)
``bc to bc
INC test,line_intersect(new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz,triangle_data(l).bx,triangle_data(l).bz,triangle_data(l).cx,triangle_data(l).cz)
IF triangle_data(l).ax=new_triangle_data(1).ax AND triangle_data(l).az=new_triangle_data(1).az
IF triangle_data(l).bx=new_triangle_data(1).bx AND triangle_data(l).bz=new_triangle_data(1).bz
IF triangle_data(l).cx=new_triangle_data(1).cx AND triangle_data(l).cz=new_triangle_data(1).cz
INC test
ENDIF
ENDIF
ENDIF
IF triangle_data(l).bx=new_triangle_data(1).bx AND triangle_data(l).az=new_triangle_data(1).az
IF triangle_data(l).cx=new_triangle_data(1).cx AND triangle_data(l).bz=new_triangle_data(1).bz
IF triangle_data(l).ax=new_triangle_data(1).ax AND triangle_data(l).cz=new_triangle_data(1).cz
INC test
ENDIF
ENDIF
ENDIF
IF triangle_data(l).cx=new_triangle_data(1).cx AND triangle_data(l).az=new_triangle_data(1).az
IF triangle_data(l).ax=new_triangle_data(1).ax AND triangle_data(l).bz=new_triangle_data(1).bz
IF triangle_data(l).bx=new_triangle_data(1).bx AND triangle_data(l).cz=new_triangle_data(1).cz
INC test
ENDIF
ENDIF
ENDIF
NEXT l
ENDFUNCTION test
FUNCTION make_intersection_points()
``ab
POSITION OBJECT dummy_ab,new_triangle_data(1).bx,0.0,new_triangle_data(1).bz
POINT OBJECT dummy_ab,new_triangle_data(1).ax,0.0,new_triangle_data(1).az
dist#=distance_3d(new_triangle_data(1).ax,0.0,new_triangle_data(1).az,new_triangle_data(1).bx,0.0,new_triangle_data(1).bz)
intersect_data(1).ab_dist=dist#
MOVE OBJECT dummy_ab,RND(dist#)
YROTATE OBJECT dummy_ab,WRAPVALUE(OBJECT ANGLE Y(dummy_ab)+90.0)
MOVE OBJECT dummy_ab,1.0
``sorts out if left or ight handed triangle then intersect is all ways on outside
IF point_in_triangle(OBJECT POSITION X(dummy_ab),OBJECT POSITION Z(dummy_ab),new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
MOVE OBJECT dummy_ab,(RND(dist#)+2.0)*-1.0
ELSE
MOVE OBJECT dummy_ab,RND(dist#)
ENDIF
intersect_data(1).ab_x=OBJECT POSITION X(dummy_ab)
intersect_data(1).ab_z=OBJECT POSITION Z(dummy_ab)
``bc
POSITION OBJECT dummy_bc,new_triangle_data(1).cx,0.0,new_triangle_data(1).cz
POINT OBJECT dummy_bc,new_triangle_data(1).bx,0.0,new_triangle_data(1).bz
dist#=distance_3d(new_triangle_data(1).bx,0.0,new_triangle_data(1).bz,new_triangle_data(1).cx,0.0,new_triangle_data(1).cz)
intersect_data(1).bc_dist=dist#
MOVE OBJECT dummy_bc,RND(dist#)
YROTATE OBJECT dummy_bc,WRAPVALUE(OBJECT ANGLE Y(dummy_bc)+90.0)
MOVE OBJECT dummy_bc,1.0
``sorts out if left or ight handed triangle then intersect is all ways on outside
IF point_in_triangle(OBJECT POSITION X(dummy_bc),OBJECT POSITION Z(dummy_bc),new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
MOVE OBJECT dummy_bc,(RND(dist#)+2.0)*-1.0
ELSE
MOVE OBJECT dummy_bc,RND(dist#)
ENDIF
intersect_data(1).bc_x=OBJECT POSITION X(dummy_bc)
intersect_data(1).bc_z=OBJECT POSITION Z(dummy_bc)
``ca
POSITION OBJECT dummy_ca,new_triangle_data(1).ax,0.0,new_triangle_data(1).az
POINT OBJECT dummy_ca,new_triangle_data(1).cx,0.0,new_triangle_data(1).cz
dist#=distance_3d(new_triangle_data(1).cx,0.0,new_triangle_data(1).cz,new_triangle_data(1).ax,0.0,new_triangle_data(1).az)
intersect_data(1).ca_dist=dist#
MOVE OBJECT dummy_ca,RND(dist#)
YROTATE OBJECT dummy_ca,WRAPVALUE(OBJECT ANGLE Y(dummy_ca)+90.0)
MOVE OBJECT dummy_ca,1.0
``sorts out if left or ight handed triangle then intersect is all ways on outside
IF point_in_triangle(OBJECT POSITION X(dummy_ca),OBJECT POSITION Z(dummy_ca),new_triangle_data(1).ax,new_triangle_data(1).az,new_triangle_data(1).bx,new_triangle_data(1).bz,new_triangle_data(1).cx,new_triangle_data(1).cz)
MOVE OBJECT dummy_ca,(RND(dist#)+2.0)*-1.0
ELSE
MOVE OBJECT dummy_ca,RND(dist#)
ENDIF
intersect_data(1).ca_x=OBJECT POSITION X(dummy_ca)
intersect_data(1).ca_z=OBJECT POSITION Z(dummy_ca)
ENDFUNCTION
FUNCTION distance_3d( x1# AS FLOAT, y1# AS FLOAT, z1# AS FLOAT, x2# AS FLOAT, y2# AS FLOAT, z2# AS FLOAT )
distance# = ABS(SQRT((x1# - x2#) ^ 2 + (y1# - y2#) ^ 2 + (z1# - z2#) ^ 2))
ENDFUNCTION distance#
FUNCTION make_next_triangle()
triangle_to_use=RND(current_triangle)
IF triangle_to_use<1
triangle_to_use=1
ENDIF
copy_triangle_to_new_list(triangle_to_use)
make_intersection_points()
side_to_use=RND(2)
SELECT side_to_use
``ab
CASE 0
new_triangle_data(1).ax=triangle_data(triangle_to_use).ax
new_triangle_data(1).az=triangle_data(triangle_to_use).az
new_triangle_data(1).cx=triangle_data(triangle_to_use).bx
new_triangle_data(1).cz=triangle_data(triangle_to_use).bz
new_triangle_data(1).bx=intersect_data(1).ab_x
new_triangle_data(1).bz=intersect_data(1).ab_z
ENDCASE
``bc
CASE 1
new_triangle_data(1).ax=triangle_data(triangle_to_use).bx
new_triangle_data(1).az=triangle_data(triangle_to_use).bz
new_triangle_data(1).cx=triangle_data(triangle_to_use).cx
new_triangle_data(1).cz=triangle_data(triangle_to_use).cz
new_triangle_data(1).bx=intersect_data(1).bc_x
new_triangle_data(1).bz=intersect_data(1).bc_z
ENDCASE
``ca
CASE 2
new_triangle_data(1).ax=triangle_data(triangle_to_use).cx
new_triangle_data(1).az=triangle_data(triangle_to_use).cz
new_triangle_data(1).cx=triangle_data(triangle_to_use).ax
new_triangle_data(1).cz=triangle_data(triangle_to_use).az
new_triangle_data(1).bx=intersect_data(1).ca_x
new_triangle_data(1).bz=intersect_data(1).ca_z
ENDCASE
ENDSELECT
ENDFUNCTION side_to_use
FUNCTION copy_triangle_to_new_list(use)
new_triangle_data(1).ax=triangle_data(use).ax
new_triangle_data(1).az=triangle_data(use).az
new_triangle_data(1).bx=triangle_data(use).bx
new_triangle_data(1).bz=triangle_data(use).bz
new_triangle_data(1).cx=triangle_data(use).cx
new_triangle_data(1).cz=triangle_data(use).cz
ENDFUNCTION
``thanks whoever did this bit of code works great
FUNCTION line_intersect(x1#,y1#,x2#,y2#,x3#,y3#,x4#,y4#)
denominator# = ((y4# - y3#)*(x2# - x1#)) - ((x4# - x3#)*(y2# - y1#))
IF denominator# <> 0
numerator# = ((x4# - x3#)*(y1# - y3#)) - ((y4# - y3#)*(x1# - x3#))
uA# = numerator# / denominator#
numerator# = ((x2# - x1#)*(y1# - y3#)) - ((y2# - y1#)*(x1# - x3#))
uB# = numerator# / denominator#
IF (uA# > 0) AND (uA# < 1) AND (uB# > 0) AND (uB# < 1)
collision = 1
ELSE
collision = 0
ENDIF
ELSE
collision = 0
ENDIF
ENDFUNCTION collision
``*******************************************************************
``turn all the data into a 3d level
``*******************************************************************
FUNCTION turn_data_into_map()
``delete all current objects
DELETE OBJECT dummy_ab
DELETE OBJECT dummy_bc
DELETE OBJECT dummy_ca
FOR l=1 TO max_triangles
delete object l
NEXT l
``find min & max
min_x#=10000.0
min_z#=10000.0
max_x#=-10000.0
max_z#=-10000.0
FOR l=1 TO max_triangles
IF triangle_data(l).ax<min_x#
min_x#=triangle_data(l).ax
ENDIF
IF triangle_data(l).bx<min_x#
min_x#=triangle_data(l).bx
ENDIF
IF triangle_data(l).cx<min_x#
min_x#=triangle_data(l).cx
ENDIF
IF triangle_data(l).az<min_z#
min_z#=triangle_data(l).az
ENDIF
IF triangle_data(l).bz<min_z#
min_z#=triangle_data(l).bz
ENDIF
IF triangle_data(l).cz<min_z#
min_z#=triangle_data(l).cz
ENDIF
IF triangle_data(l).ax>max_x#
max_x#=triangle_data(l).ax
ENDIF
IF triangle_data(l).bx>max_x#
max_x#=triangle_data(l).bx
ENDIF
IF triangle_data(l).cx>max_x#
max_x#=triangle_data(l).cx
ENDIF
IF triangle_data(l).az>maz_z#
max_z#=triangle_data(l).az
ENDIF
IF triangle_data(l).bz>maz_z#
max_z#=triangle_data(l).bz
ENDIF
IF triangle_data(l).cz>maz_z#
max_z#=triangle_data(l).cz
ENDIF
NEXT l
ustep#=1.0/(max_x#-min_x#)
vstep#=1.0/(max_z#-min_z#)
create_memblockobject(1,max_triangles*3)
``floor
vertex=0
FOR l=1 TO max_triangles
create_vertex(1,vertex,triangle_data(l).ax,-5.0,triangle_data(l).az,0,(triangle_data(l).ax+min_x#)*ustep#,(triangle_data(l).az+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,-5.0,triangle_data(l).bz,0,(triangle_data(l).bx+min_x#)*ustep#,(triangle_data(l).bz+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,-5.0,triangle_data(l).cz,0,(triangle_data(l).cx+min_x#)*ustep#,(triangle_data(l).cz+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
NEXT l
make_object(1,1,1,0)
SET OBJECT NORMALS 1
TEXTURE OBJECT 1,3
SCALE OBJECT TEXTURE 1,20,20
``COLOR OBJECT 1,RGB(255,0,0)
``set object wireframe 1,1
``ceiling
vertex=0
FOR l=1 TO max_triangles
create_vertex(1,vertex,triangle_data(l).cx,5.0,triangle_data(l).cz,0,(triangle_data(l).ax+min_x#)*ustep#,(triangle_data(l).az+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,5.0,triangle_data(l).bz,0,(triangle_data(l).bx+min_x#)*ustep#,(triangle_data(l).bz+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,5.0,triangle_data(l).az,0,(triangle_data(l).cx+min_x#)*ustep#,(triangle_data(l).cz+min_z#)*vstep#)
set_normal(1,vertex,0,1,0)
INC vertex
NEXT l
make_object(2,1,1,0)
SET OBJECT NORMALS 2
TEXTURE OBJECT 2,2
SCALE OBJECT TEXTURE 2,20,20
``COLOR OBJECT 2,RGB(0,255,0)
``SET OBJECT WIREFRAME 2,1
``walls
``find number of edges
num_edges=0
FOR l=1 TO max_triangles
IF triangle_data(l).ab_used=0
INC num_edges
ENDIF
IF triangle_data(l).bc_used=0
inc num_edges
ENDIF
IF triangle_data(l).ca_used=0
INC num_edges
ENDIF
NEXT l
DELETE MEMBLOCK 1
create_memblockobject(1,num_edges*2*3)
vertex=0
FOR l=1 TO max_triangles
IF triangle_data(l).ab_used=0
create_vertex(1,vertex,triangle_data(l).ax,-5.0,triangle_data(l).az,0,0.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,5.0,triangle_data(l).az,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,-5.0,triangle_data(l).bz,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,-5.0,triangle_data(l).bz,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,5.0,triangle_data(l).az,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,5.0,triangle_data(l).bz,0,1.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
ENDIF
IF triangle_data(l).bc_used=0
create_vertex(1,vertex,triangle_data(l).bx,-5.0,triangle_data(l).bz,0,0.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,5.0,triangle_data(l).bz,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,-5.0,triangle_data(l).cz,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,-5.0,triangle_data(l).cz,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).bx,5.0,triangle_data(l).bz,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,5.0,triangle_data(l).cz,0,1.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
ENDIF
IF triangle_data(l).ca_used=0
create_vertex(1,vertex,triangle_data(l).cx,-5.0,triangle_data(l).cz,0,0.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,5.0,triangle_data(l).cz,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,-5.0,triangle_data(l).az,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,-5.0,triangle_data(l).az,0,1.0,0.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).cx,5.0,triangle_data(l).cz,0,0.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
create_vertex(1,vertex,triangle_data(l).ax,5.0,triangle_data(l).az,0,1.0,1.0)
set_normal(1,vertex,1,0,0)
INC vertex
ENDIF
NEXT l
make_object(3,1,1,0)
SET OBJECT NORMALS 3
TEXTURE OBJECT 3,1
``COLOR OBJECT 3,RGB(0,0,255)
``SET OBJECT WIREFRAME 3,1
ENDFUNCTION
FUNCTION create_memblockobject(memnum,v)
MAKE MEMBLOCK memnum,12+(32*v)
WRITE MEMBLOCK DWORD memnum,0,274
WRITE MEMBLOCK DWORD memnum,4,32
WRITE MEMBLOCK DWORD memnum,8,v
ENDFUNCTION
FUNCTION create_vertex(memnum,v,vposx#,vposy#,vposz#,color AS DWORD,u#,v#)
WRITE MEMBLOCK FLOAT memnum,v*32+12,vposx#
WRITE MEMBLOCK FLOAT memnum,v*32+16,vposy#
WRITE MEMBLOCK FLOAT memnum,v*32+20,vposz#
``write memblock dword memnum,v*36+36,color `not needed in 274fvf format diffuse color seems to mess up some shader code as well
WRITE MEMBLOCK FLOAT memnum,v*32+36,u#
WRITE MEMBLOCK FLOAT memnum,v*32+40,v#
ENDFUNCTION
FUNCTION set_normal(memnum,v,normalx#,normaly#,normalz#)
WRITE MEMBLOCK FLOAT memnum,v*32+24,normalx#
WRITE MEMBLOCK FLOAT memnum,v*32+28,normaly#
WRITE MEMBLOCK FLOAT memnum,v*32+32,normalz#
ENDFUNCTION
FUNCTION make_object(objnum,meshnum,memnum,imgnum)
IF OBJECT EXIST (objnum) THEN DELETE OBJECT objnum
IF MESH EXIST (meshnum) THEN DELETE MESH meshnum
MAKE MESH FROM MEMBLOCK meshnum,memnum
MAKE OBJECT objnum,meshnum,imgnum
ENDFUNCTION
Feel free to rip it it bits and see how it ticks,maths isnt my strong point so i must admit that the line intersection code was snipped from a thread along time ago and i cant remember who wrote it but thanks.