Main sections
X_COLLISIONRAY()
scal# = X_COLLISIONRAY(num#, frame#, x#, y#, z#, dirx#, diry#, dirz#)
Checks if the 3D object num# collides with a ray through x#,y#,z# heading in direction dir#.
If the object and ray collide, scal# will be the distance from point x#,y#,z# heading in direction dir#.
If the object and ray do not collide then scal# = 0.
scal# < 0 will only be returned if no collision in positive direction is found.
If there is a collision in both the positive and negative directions then the distance to the positive result will be returned, regardless of which collision is closer.
In the debug-mode lines will be drawn:
- green = collision, scal# > 0
- yellow = collision, scal# < 0 (backwards)
- red = no collision at all
// --------------------------------- //
// Project:
// Start: Saturday, July 20, 2002
// First we need an object. Here: a simple paper plane
// We assume Z is down, as most 3d programs will export
// Also we assume the x axis (positive) is the direction
// the plane will fly forwards, so in a right hand system
// y will be left side of plane.
// Triangle Strips will be drawn:
//
//  1---2---5
//   \ / \ /|
//    3---4 |
//         \|
//          6
    LOADSPRITE "News.bmp", 0
    col = RGB(0xff, 0xff, 0xff)
    X_OBJSTART 0 // PlaneID = 0
        // Right wing:                 side updown
        X_OBJADDVERTEX -7,  5,  0,     1.0, 1.0, col // Outer point
        X_OBJADDVERTEX -7,  1,  0,     1.0, 0.5, col // Inner edge
        X_OBJADDVERTEX  7,  0,  0,     0.0, 1.0, col // Top
        // Right body:
        X_OBJADDVERTEX -7,  0,  3,     0.0, 1.0, col
    X_OBJNEWGROUP
        // Left wing:
        X_OBJADDVERTEX -7, -5,  0,     0.0, 0.0, col
        X_OBJADDVERTEX -7, -1,  0,     0.0, 0.5, col
        X_OBJADDVERTEX  7,  0,  0,     1.0, 0.0, col
        // Left body:
        X_OBJADDVERTEX -7,  0,  3,     0.0, 1.0, col
    X_OBJEND
    X_SAVEOBJ "plane.ddd", 0
    X_LOADOBJ "plane.ddd", 0
LIMITFPS -1
WHILE TRUE
    MOUSESTATE mx, my, mb1, mb2
    
    DRAWRECT mx-8,my-8,16,16, RGB(255,0,0)
    X_MAKE3D 1, 1000, 45 // Turn to 3D Viewport
    X_CAMERA   200*SIN(mx*360/640), my*2-100, 200*COS(mx), 0,0,0 // Rotate CAMERA with mouse
    dtime = GETTIMER()
    psi=psi+(dtime/64); IF psi>=360 THEN psi=0
    FOR phi = 0 TO 360 STEP 30
        X_DRAWAXES 0,0,0 // Draw global axes (red=x, green=y, blue=z)
        alpha = (phi+psi)*4
        LOCAL px=200*SIN(phi+psi),py=SIN(alpha)*20,pz=100*COS(phi+psi)
        X_MOVEMENT px,py,pz
        X_SCALING 2,2,2
        X_ROTATION 90,1,0,0        // Make plane body point down global y
        X_ROTATION 45*COS(alpha),0,0,1        // make plane look up/down with mouse
        X_ROTATION phi+psi, 0,1,0    // Rtoation due to position in circle
        X_SETTEXTURE 0, -1
        X_DRAWOBJ 0, 0 // Draw Object#0. Frame# is always 0 with user def. objects
        // PICKING PART!
        LOCAL x,y,z, x2,y2,z2
        X_SCREEN2WORLD mx, my,  0, x, y, z
        X_SCREEN2WORLD mx, my, -1, x2,y2,z2
        IF X_COLLISIONRAY(0,0, x,y,z, x2-x, y2-y, z2-z)<>0
            X_PRINT "PICK", px,py,pz, 0
        ENDIF
    NEXT
    fps = ((1000/dtime)+fps)/2
    delay=delay+dtime
    IF delay>1000 // 1/2 sec
        delay=0
        showfps=fps
    ENDIF
    X_MAKE2D
    PRINT "FPS: " +INTEGER(showfps), 100, 100 // + dtime, 0,0
    SHOWSCREEN
WEND

