Changeset 295 for trunk/thune/gl

Show
Ignore:
Timestamp:
10/06/06 19:34:27 (2 years ago)
Author:
krobillard
Message:

Thune GL -

Added 'look-at.
mouse-move event now sends deltas.
Test now shows object with turntable camera.

Location:
trunk/thune/gl
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/thune/gl/draw_list.c

    r289 r295  
    2323#include "draw_ops.h" 
    2424#include "gllist.h" 
     25#include "math3d.h" 
    2526 
    2627#include <ft2build.h> 
     
    301302    UCell* val; 
    302303    UBlock* blk = ur_blockPtr( ctx->ctx.valBlk ); 
    303  
    304     val = blk->ptr.cells + CAM_CTX_VIEWPORT; 
     304    UCell* ctxCells = blk->ptr.cells; 
     305 
     306    val = ctxCells + CAM_CTX_VIEWPORT; 
    305307    if( ur_is(val, UT_COORD) && (val->coord.len > 3) ) 
    306308    { 
     
    320322        //       left, right, bottom, top, near, far 
    321323 
    322         fov = number_d( blk->ptr.cells + CAM_CTX_FOV ); 
     324        fov = number_d( ctxCells + CAM_CTX_FOV ); 
    323325        if( fov > 0.0 ) 
    324326        { 
    325327            gluPerspective( fov, aspect, 
    326                     number_d( blk->ptr.cells + CAM_CTX_NEAR ), 
    327                     number_d( blk->ptr.cells + CAM_CTX_FAR ) ); 
     328                    number_d( ctxCells + CAM_CTX_NEAR ), 
     329                    number_d( ctxCells + CAM_CTX_FAR ) ); 
    328330        } 
    329331        else 
     
    332334            h *= 0.5; 
    333335            glOrtho( -w, w, -h, h, 
    334                      number_d( blk->ptr.cells + CAM_CTX_NEAR ), 
    335                      number_d( blk->ptr.cells + CAM_CTX_FAR ) ); 
     336                     number_d( ctxCells + CAM_CTX_NEAR ), 
     337                     number_d( ctxCells + CAM_CTX_FAR ) ); 
    336338        } 
    337339 
    338340        glMatrixMode( GL_MODELVIEW ); 
    339341 
    340         val = blk->ptr.cells + CAM_CTX_ORIENT; 
    341         if( ur_is(val, UT_MATRIX) ) 
    342         { 
    343             //GLfloat eye[16]; 
    344             //ur_matrixInverse( eye, arr->ptr.floats ); 
    345             //glLoadMatrixf( eye ); 
    346             glLoadIdentity(); 
     342        val = ctxCells + CAM_CTX_ORIENT; 
     343        if( ur_is(val, UT_ARRAY) && (ur_arrayDT(val) == UT_DECIMAL) ) 
     344        { 
     345            GLfloat eye[16]; 
     346            UBinary* arr = ur_bin(val); 
     347            if( arr->used == 16 ) 
     348            { 
     349                ur_matrixInverse( eye, arr->ptr.f ); 
     350                glLoadMatrixf( eye ); 
     351            } 
     352            else 
     353            { 
     354                glLoadIdentity(); 
     355            } 
    347356        } 
    348357        else 
     
    462471 
    463472            case DOP_CAMERA: 
     473            { 
     474                //int ref = ur_selIsAtom(pc) ? ur_sel(pc) : 0; 
    464475                ++pc; 
    465476                VAL_WORD_OR_PC 
    466477                if( ur_is(val, UT_CONTEXT) ) 
    467478                    dop_camera( val ); 
     479            } 
    468480                break; 
    469481 
  • trunk/thune/gl/gx.c

    r287 r295  
    3131#include "audio.h" 
    3232#include "gllist.h" 
    33 /* 
    3433#include "math3d.h" 
    35 #include <time.h> 
    36 */ 
     34//#include <time.h> 
    3735 
    3836#ifdef __APPLE__ 
     
    4846#define colorU8ToF(n)    (((GLfloat) n) / 255.0f) 
    4947 
     48#define MOUSE_UNSET     -9999 
     49 
    5050 
    5151#if 0 
     
    5353 
    5454#define RESTYPE    argc 
    55  
    56 #define MOUSE_UNSET     -9999 
    5755 
    5856 
     
    220218            ur_initType(val, UT_LOGIC); 
    221219            ur_logic(val) = 1; 
    222 /* 
    223             gEnv.prev_mouseX = MOUSE_UNSET; 
    224 */ 
     220 
     221            env->prevMouseX = MOUSE_UNSET; 
    225222            break; 
    226223 
     
    282279 
    283280        case GLV_EVENT_MOTION: 
    284             val = _appendEvent( env->eventBlk, UR_ATOM_MOUSE_MOVE ); 
    285             ++val; 
    286             ur_initType(val, UT_COORD); 
    287             val->coord.len     = 2; 
    288             val->coord.elem[0] = event->x; 
    289             val->coord.elem[1] = view->height - event->y - 1; 
    290 /* 
    291         { 
    292             //printf( "KR mouse-move %d %d\n", event->x, event->y ); 
    293  
    294             iv[ INPUT_MX ].integer = event->x; 
    295             iv[ INPUT_MY ].integer = gView->height - event->y - 1; 
    296  
    297             if( gEnv.prev_mouseX == MOUSE_UNSET ) 
     281        { 
     282            int dx, dy; 
     283 
     284            if( env->prevMouseX == MOUSE_UNSET ) 
    298285            { 
    299                 printf( "KR mouse reset\n" ); 
    300                 iv[ INPUT_DX ].integer = 0; 
    301                 iv[ INPUT_DY ].integer = 0; 
     286                printf( "KR mouse-move reset\n" ); 
     287                dx = dy = 0; 
    302288            } 
    303289            else 
    304290            { 
    305                 iv[ INPUT_DX ].integer = event->x - gEnv.prev_mouseX; 
    306                 iv[ INPUT_DY ].integer = gEnv.prev_mouseY - event->y; 
     291                dx = event->x - env->prevMouseX; 
     292                dy = env->prevMouseY - event->y; 
    307293            } 
    308  
    309             orEvalBlock( orBLOCKS + blkV->index, blkV->series.it ); 
    310             gxHandleError(); 
    311  
    312             gEnv.prev_mouseX = event->x; 
    313             gEnv.prev_mouseY = event->y; 
    314         } 
    315 */ 
     294            env->prevMouseX = event->x; 
     295            env->prevMouseY = event->y; 
     296 
     297            val = _appendEvent( env->eventBlk, UR_ATOM_MOUSE_MOVE ); 
     298            ++val; 
     299 
     300            // coord elements: x, y, dx, dy 
     301 
     302            ur_initType(val, UT_COORD); 
     303            val->coord.len     = 5; 
     304            val->coord.elem[0] = event->x; 
     305            val->coord.elem[1] = view->height - event->y - 1; 
     306            val->coord.elem[2] = dx; 
     307            val->coord.elem[3] = dy; 
     308            val->coord.elem[4] = event->state; 
     309        } 
    316310            break; 
    317311 
     
    10641058    } 
    10651059    UR_S_DROP; 
     1060} 
     1061 
     1062 
     1063// (matrix vec3 -- ) 
     1064UR_CALL( uc_look_at ) 
     1065{ 
     1066    UCell* prev; 
     1067    UBinary* bin; 
     1068    float* right; 
     1069    float* up; 
     1070    float* zv; 
     1071 
     1072    prev = ur_s_prev(tos); 
     1073 
     1074    if( ur_is(prev, UT_ARRAY) && ur_is(tos, UT_VEC3) ) 
     1075    { 
     1076        bin = ur_bin( prev ); 
     1077 
     1078        right = bin->ptr.f; 
     1079        up    = bin->ptr.f + 4; 
     1080        zv    = bin->ptr.f + 8; 
     1081 
     1082        zv[0] = zv[4] - tos->vec3.xyz[0]; 
     1083        zv[1] = zv[5] - tos->vec3.xyz[1]; 
     1084        zv[2] = zv[6] - tos->vec3.xyz[2]; 
     1085        ur_normalize( zv ); 
     1086 
     1087        up[0] = 0.0; 
     1088        up[1] = 1.0; 
     1089        up[2] = 0.0; 
     1090 
     1091        ur_cross( up, zv, right ); 
     1092        ur_normalize( right ); 
     1093 
     1094        // Recompute up to make perpendicular to right & zv. 
     1095        ur_cross( zv, right, up ); 
     1096        ur_normalize( up ); 
     1097 
     1098        UR_S_DROPN( 2 ); 
     1099        return; 
     1100    } 
     1101 
     1102    ur_throwErr( UR_ERR_DATATYPE, "look-at expected array! vec3!" ); 
    10661103} 
    10671104 
     
    17701807    { uc_load_png,       "load-png" }, 
    17711808    { uc_load_wav,       "load-wav" }, 
    1772     { uc_display,        "display" } 
     1809    { uc_display,        "display" }, 
     1810    { uc_look_at,        "look-at" } 
    17731811}; 
    17741812 
     
    18191857 
    18201858    gxEnv.view = 0; 
     1859    gxEnv.prevMouseX = MOUSE_UNSET; 
     1860    gxEnv.prevMouseY = MOUSE_UNSET; 
    18211861 
    18221862    _createFixedAtoms( env ); 
  • trunk/thune/gl/gx.h

    r286 r295  
    133133    double view_aspect; 
    134134 
     135    int prevMouseX; 
     136    int prevMouseY; 
     137 
    135138    UIndex  eventBlkHold; 
    136139    UBlock* eventBlk; 
    137140 
    138141#if 0 
    139     UAtom atom_joystick; 
    140     UAtom atom_model; 
    141     UAtom atom_solid; 
    142  
    143142    UContext input_ctx; 
    144143    UCell*  input_values; 
     
    146145    UIndex  widgetCtxN; 
    147146    UIndex  drawListDialectBlkN; 
    148  
    149     int prev_mouseX; 
    150     int prev_mouseY; 
    151147 
    152148    int running; 
  • trunk/thune/gl/gx.t

    r286 r295  
    1515 
    1616[ 
    17     none :orientation 
     17    none :orient 
    1818    none :position 
    1919    none :viewport 
  • trunk/thune/gl/test.t

    r287 r295  
    4141] 
    4242draw-list.compile :bg-list 
     43 
     44 
     45"data/d7.gx" load draw-list.compile :d7-list 
    4346 
    4447 
     
    7376 
    7477 
     78camera [ 
     79    60.0  :fov 
     80     1.0  :near 
     81   9000.0 :far 
     82   20,20,200,200 :viewport 
     83   #[1.0  0    0    0 
     84     0    1.0  0    0 
     85     0    0    1.0  0 
     86     0    0   15.0  1.0] :orient 
     87 
     88    0.0  :azimuth 
     89    0.0  :elev 
     90    15.0 :dist 
     91    0.0,0.0,0.0 :focal-pnt 
     92 
     93    [dx dy /*| ced*/] 
     94    [ 
     95        dx  0.5 mul to-rad azimuth add :azimuth 
     96        dy -0.5 mul to-rad elev add  -1.53938 1.53938 limit :elev 
     97 
     98        ;["az-el" azimuth to-deg elev to-deg] print  
     99 
     100        elev cos dist mul dup /*:ced*/ 
     101        azimuth cos /*ced*/  mul focal-pnt/1 add :orient/13 
     102        elev    sin  dist    mul focal-pnt/2 add :orient/14 
     103        azimuth sin /*ced*/  mul focal-pnt/3 add :orient/15 
     104 
     105        orient focal-pnt look-at 
     106    ] 
     107    func :turntable 
     108] make :visual-cam 
     109 
    75110-1,-1 :mouse-pos 
    76111-1,-1 :click-pos 
     112 
     113 
     114 
     115 
     116/* 
     117event-handler [ 
     118    mouse-move [["move:" x y] print] 
     119    mouse-move left-button [visual-cam/orient dx dy] 
     120] 
     121*/ 
    77122 
    78123[ 
     
    90135        dup :area 
    91136        dup :ortho-cam/viewport 
    92         ;ortho-cam 'ortho update-projection 
     137 
     138        dup :.t 
     139        .t/3 2 div :.t/3 
     140        .t/4 2 div :.t/4 
     141        .t :visual-cam/viewport 
    93142    ] 
    94143 
     
    96145        dup :mouse-pos 
    97146        ;"move: "   prin dup . 
     147 
     148        mouse-pos/5 zero? iff ( 
     149            mouse-pos/3 mouse-pos/4 visual-cam/turntable 
     150        ) 
    98151    ] 
    99152    mouse-down  [ 
     
    112165 
    113166    draw-list [ 
     167        camera visual-cam 
     168        solid 
     169        call d7-list 
     170 
    114171        camera ortho-cam 
    115172        push 
     
    124181        text mouse-pos mouse-pos 
    125182 
    126         ;font fontF 
    127         ;text 0,40 "Ceti Alpha III" 
     183        font fontF 
     184        text 0,40 "Ceti Alpha III" 
    128185 
    129186        ;children ['draw get do] iter 
     
    228285 
    229286font! ["data/20thfont.ttf" 22] make :fontA 
    230 ;font! ["data/FederationBold_KR.ttf" 12 256,128] make :fontF 
     287font! ["data/FederationBold_KR.ttf" 12 256,128] make :fontF 
    231288 
    232289