Hi,
I've got a little problem with the visibility of cubes. I work on a little experiment, where I try to make a big cube with 16 x 16 x 16 small cube.
Now I need only the cubes that the camera can see, everything else isn't necessary to render. The only problem that I have is to detect which cube is hidden.
I tried X_COLLISIONRAY but I've no idea how to use it right.
This is my code for now...
Any idea how I can implement it right?
CU
W.
I've got a little problem with the visibility of cubes. I work on a little experiment, where I try to make a big cube with 16 x 16 x 16 small cube.
Now I need only the cubes that the camera can see, everything else isn't necessary to render. The only problem that I have is to detect which cube is hidden.
I tried X_COLLISIONRAY but I've no idea how to use it right.
This is my code for now...
Code (glbasic) Select
// --------------------------------- //
// Project: voxel
// Start: Tuesday, October 01, 2013
// IDE Version: 11.322
// SETCURRENTDIR("Media") // go to media files
TYPE cube_type
typ
x
y
z
active
ENDTYPE
GLOBAL cube[] AS cube_type
GLOBAL counter, visible, size_total
main()
FUNCTION main:
CreateCube(0, 1, RGB(255, 0, 0))
CreateCube(1, 1, RGB(0, 255, 0))
CreateCube(2, 1, RGB(0, 0, 255))
size_total = 16
create_base_chunk(size_total)
WHILE TRUE
X_MAKE3D 1, 1000, 45
X_CAMERA 25, 25, 20, 0, 0, 0
visible = 0
draw_chunk(size_total)
X_MAKE2D
PRINT "counter: " + counter, 0, 0
PRINT "visible: " + visible, 0, 20
SHOWSCREEN
WEND
ENDFUNCTION
FUNCTION draw_chunk: size
FOREACH c IN cube[]
IF c.active = TRUE
INC visible, 1
X_MOVEMENT c.x - (size/2), c.z - (size/2), c.y - (size/2)
X_DRAWOBJ c.typ, 0
ENDIF
NEXT
ENDFUNCTION
FUNCTION create_base_chunk: size
LOCAL tmp_x, tmp_y, tmp_z
LOCAL c AS cube_type
LOCAL hit
FOR tmp_x = 0 TO size - 1
FOR tmp_y = 0 TO size - 1
FOR tmp_z = 0 TO size - 1
c.typ = RND(2)
c.x = tmp_x
c.y = tmp_y
c.z = tmp_z
c.active = TRUE
DIMPUSH cube[], c
INC counter, 1
NEXT
NEXT
NEXT
ENDFUNCTION
// ------------------------------------------------------------- //
// -=# CREATECUBE #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz, sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, sz, sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, co :ol
X_OBJADDVERTEX -sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND
ENDFUNCTION // sz
Any idea how I can implement it right?
CU
W.