I've always had a thing for voxels, renewed when I found out about voxlap. But I'm not about to mess with ray tracing math.
I posted for some recommendations on how to fix a issue I was having. But I had a chance to read through it again and made it simpler and work. So yay.
So now that I got it fixed up, here's the code. I've got some more fun test I want to work on...
First here's a screen capture and a compiled exe.
Download cube16.zipUPDATED 3/13/10
Now it will show a bunch of same model, with ripped FPS code showing you the frame rate. I think I fixed the hole problem that I kept seeing.
// --------------------------------- //
// Project: Cube16
// Start: Thursday, March 04, 2010
// Author: Scott A. Williams
// IDE Version: 7.285
//Object conversion
DIM cbox[18][18][18]
// Init =====================================================================================||
// Main =====================================================================================||
// Test =====================================================================================||
GLOBAL cnt, rot=0, final = FALSE
//Process
GOSUB make_obj_thinwall
create_obj(1)
//X_LOADOBJ "dump.ddd", 1
GOSUB ShowFPS
PRINT "done",300,100
SHOWSCREEN
KEYWAIT
X_AUTONORMALS 0
WHILE final = FALSE
//Display
X_MAKE3D 1, 128, 45
X_CAMERA 9-rot,8,48+rot, 9,8,0
X_CULLMODE 0
//X_SPOT_LT 0, RGB(255,255,255), 8,16,32, 1,-1,-1, 90
//X_SPOT_LT 1, RGB(255,255,255), 8,16,-16, -1,-1,-1, 90
IF rot < 96
INC rot, 1
ELSE
rot = 0
ENDIF
FOR cnt = 0 TO 5
X_MOVEMENT 16,0,-8*cnt; X_DRAWOBJ 1,0
X_MOVEMENT 0,-16,-8*cnt; X_DRAWOBJ 1,0
X_MOVEMENT 0,16,-8*cnt; X_DRAWOBJ 1,0
X_MOVEMENT -16,0,-8*cnt; X_DRAWOBJ 1,0
NEXT
GOSUB ShowFPS
SHOWSCREEN
IF KEY(1) THEN final = TRUE
WEND
END
// Subs =====================================================================================||
SUB make_obj_thinwall:
// Create 1 thick 16 squared wall
LOCAL cx, cy, cz
FOR cy = 0 TO 17
FOR cx = 0 TO 17
FOR cz = 0 TO 17
cbox[cx][cy][cz] = 0
NEXT
NEXT
NEXT
FOR cy = 1 TO 16
FOR cx = 1 TO 16
FOR cz = 1 TO 7
cbox[cx][cy][cz] = 1//RND(1)
NEXT
NEXT
NEXT
ENDSUB
FUNCTION create_obj: index
// Scan through object data, create model
LOCAL cx, cy, cz
LOCAL fn,fs,fe,fw,fu,fd,fc
LOCAL first = 0
LOCAL line = 0, tic = 0
X_OBJSTART index
FOR cy = 1 TO 16
FOR cx = 1 TO 16
FOR cz = 1 TO 16
IF cbox[cx][cy][cz] > 0
fn = cbox[cx][cy][cz-1]
fs = cbox[cx][cy][cz+1]
fw = cbox[cx+1][cy][cz]
fe = cbox[cx-1][cy][cz]
fd = cbox[cx][cy-1][cz]
fu = cbox[cx][cy+1][cz]
fc = cbox[cx][cy][cz]
make_cube(cx,cy,cz,fn,fs,fe,fw,fu,fd,fc)
PRINT "posxyz:" + cx+cy+cz + " facekey:"+fn+fs+fe+fw+fu+fd+" color:"+fc,0,8*line
INC line, 1
ENDIF
PRINT "sector:"+tic+" value:"+cbox[cx][cy][cz],400,8*line
INC tic, 1
NEXT
NEXT
NEXT
X_OBJEND
X_SAVEOBJ "dump.ddd", index
ENDFUNCTION
FUNCTION make_cube: x,y,z,n,s,w,e,u,d,col
color = RGB((y*4)+64,(y*4)+64,(z*4)+64)
IF n = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x+1,y,z,1,0,color
X_OBJADDVERTEX x,y,z,0,0,color
X_OBJADDVERTEX x+1,y+1,z,1,1,color
X_OBJADDVERTEX x,y+1,z,0,1,color
ENDIF
IF s = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x+1,y+1,z+1,1,1,color
X_OBJADDVERTEX x+1,y,z+1,1,0,color
X_OBJADDVERTEX x,y+1,z+1,0,1,color
X_OBJADDVERTEX x,y,z+1,0,0,color
ENDIF
IF e = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x+1,y+1,z+1,1,1,color
X_OBJADDVERTEX x+1,y+1,z,1,0,color
X_OBJADDVERTEX x+1,y,z+1,0,1,color
X_OBJADDVERTEX x+1,y,z,0,0,color
ENDIF
IF w = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x,y+1,z,1,0,color
X_OBJADDVERTEX x,y,z,0,0,color
X_OBJADDVERTEX x,y+1,z+1,1,1,color
X_OBJADDVERTEX x,y,z+1,0,1,color
ENDIF
IF u = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x,y+1,z,0,0,color
X_OBJADDVERTEX x,y+1,z+1,0,1,color
X_OBJADDVERTEX x+1,y+1,z,1,0,color
X_OBJADDVERTEX x+1,y+1,z+1,1,1,color
ENDIF
IF d = 0
X_OBJNEWGROUP
X_OBJADDVERTEX x,y,z+1,0,1,color
X_OBJADDVERTEX x+1,y,z+1,1,1,color
X_OBJADDVERTEX x,y,z,0,0,color
X_OBJADDVERTEX x+1,y,z,1,0,color
ENDIF
ENDFUNCTION
// ------------------------------------------------------------- //
// -=# SHOWFPS #=-
// ------------------------------------------------------------- //
SUB ShowFPS:
X_MAKE2D
dtime=GETTIMER()
fps = ((1000/dtime)+fps)/2
delay=delay+dtime
IF delay>1000 // 1/2 sec
delay=0
fps_draw=fps
ENDIF
PRINT "FPS: "+fps_draw, 0 ,0
ENDSUB // SHOWFPS