00001 #include "aren.h"
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 static float * AREN_colortable = NULL ;
00036 static float * AREN_graytable  = NULL ;
00037 static float * AREN_opatable   = NULL ;
00038 
00039 void init_AREN_colortable( void )
00040 {
00041    static int been_here = 0 ;
00042    int ii , rr,gg,bb , ss ;
00043 
00044    if( been_here ) return ;  
00045 
00046    AREN_colortable = (float *) malloc( sizeof(float) * TOT_COLORS * 3 ) ;
00047    AREN_graytable  = (float *) malloc( sizeof(float) * MAX_GRAYS ) ;
00048    AREN_opatable   = (float *) malloc( sizeof(float) * MAX_GRAYS ) ;
00049 
00050    
00051 
00052    for( ii=0 ; ii < MAX_GRAYS ; ii++ ){
00053       AREN_graytable[ii] = ii ;
00054       AREN_opatable[ii]  = ii / 255.0 ;
00055    }
00056 
00057    
00058 
00059    for( rr=0 ; rr < MAX_CDIM ; rr++ ){
00060       for( gg=0 ; gg < MAX_CDIM ; gg++ ){
00061          for( bb=0 ; bb < MAX_CDIM ; bb++ ){
00062 
00063             ss = FIVE_to_short(rr,gg,bb) ;   
00064 
00065             AREN_colortable[3*ss  ] = (rr * 255.0) / 31.0 ;
00066             AREN_colortable[3*ss+1] = (gg * 255.0) / 31.0 ;
00067             AREN_colortable[3*ss+2] = (bb * 255.0) / 31.0 ;
00068          }
00069       }
00070    }
00071 
00072    
00073 
00074    ss = 3 * MAX_COLORS ;
00075    for( ii=0 ; ii < MAX_GRAYS ; ii++ ){
00076       AREN_colortable[ss++] = ii ;
00077       AREN_colortable[ss++] = ii ;
00078       AREN_colortable[ss++] = ii ;
00079    }
00080 
00081    been_here = 1 ;
00082    return ;
00083 }
00084 
00085 
00086 
00087 
00088 
00089 
00090 #define DEFAULT_THETA 130.0
00091 #define DEFAULT_PHI   285.0
00092 
00093 void * new_AREN_renderer( void )
00094 {
00095    AREN_stuff * ar ;
00096 
00097    ar = (AREN_stuff *) malloc( sizeof(AREN_stuff) ) ;
00098    ar->type = AREN_TYPE ;
00099 
00100    init_AREN_colortable() ;  
00101 
00102    
00103 
00104    ar->vpc = vpCreateContext() ;
00105 
00106    vpSeti( ar->vpc , VP_CONCAT_MODE , VP_CONCAT_LEFT ) ;
00107 
00108    vpCurrentMatrix( ar->vpc , VP_MODEL ) ;
00109    vpIdentityMatrix( ar->vpc ) ;
00110 
00111    vpCurrentMatrix( ar->vpc , VP_VIEW ) ;
00112    vpIdentityMatrix( ar->vpc ) ;
00113    vpRotate( ar->vpc , VP_Y_AXIS , DEFAULT_THETA ) ;
00114    vpRotate( ar->vpc , VP_X_AXIS , DEFAULT_PHI   ) ;
00115 
00116 #undef USE_CUEING
00117 #ifdef USE_CUEING
00118    vpSetDepthCueing( ar->vpc , 1.0 , 0.5 ) ;
00119    vpEnable( ar->vpc , VP_DEPTH_CUE , 1 ) ;
00120 #endif
00121 
00122    vpCurrentMatrix( ar->vpc , VP_PROJECT ) ;
00123    vpIdentityMatrix( ar->vpc ) ;
00124    vpWindow( ar->vpc , VP_PARALLEL , -0.5,0.5 , -0.5,0.5 , -0.5,0.5 ) ;
00125 
00126    
00127 
00128    ar->nx = ar->ny = ar->nz = ar->verbose = ar->newdata = ar->newvox = 0 ;
00129    ar->sx = ar->sy = ar->sz = 1.0 ;
00130 
00131    ar->theta = DEFAULT_THETA ;
00132    ar->phi   = DEFAULT_PHI ;
00133    ar->grim  = ar->rim = ar->gim = ar->bim = ar->opim = NULL ;
00134    ar->vox   = NULL ;
00135 
00136    return (void *) ar ;
00137 }
00138 
00139 
00140 
00141 
00142 
00143 void destroy_AREN_renderer( void * ah )
00144 {
00145    AREN_stuff * ar = (AREN_stuff *) ah ;
00146 
00147    if( !ISVALID_AREN(ar) ) return ;
00148 
00149    if( ar->vox != NULL ) free(ar->vox) ;
00150    vpDestroyContext( ar->vpc ) ;
00151    free(ar) ;
00152    return ;
00153 }
00154 
00155 
00156 
00157 
00158 
00159 void AREN_be_verbose( void * ah )
00160 {
00161    AREN_stuff * ar = (AREN_stuff *) ah ;
00162    if( !ISVALID_AREN(ar) ) return ;
00163    ar->verbose = 1 ; return ;
00164 }
00165 
00166 void AREN_be_quiet( void * ah )
00167 {
00168    AREN_stuff * ar = (AREN_stuff *) ah ;
00169    if( !ISVALID_AREN(ar) ) return ;
00170    ar->verbose = 0 ; return ;
00171 }
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 int AREN_set_graybrick( void * ah , MRI_IMAGE * grim )
00181 {
00182    AREN_stuff * ar = (AREN_stuff *) ah ;
00183    int newvox=0 , nvox,ii ;
00184    byte    * gar ;
00185    rgbvox  * gvox ;
00186    byte      gb ;
00187 
00188    
00189 
00190    if( !ISVALID_AREN(ar) || grim == NULL || grim->kind != MRI_byte ) return -1 ;
00191 
00192    if( grim->nx < 3 || grim->ny < 3 || grim->nz < 3 ){
00193       fprintf(stderr,"**AREN: illegal dimensions for a gray brick\n") ;
00194       return -1 ;
00195    }
00196 
00197    
00198 
00199    if( ar->rim != NULL ){
00200       ar->rim = ar->gim = ar->bim = NULL ;
00201       if( ar->verbose )
00202          fprintf(stderr,"--AREN: switching from color bricks to gray brick\n") ;
00203    } else {
00204       if( ar->verbose )
00205          fprintf(stderr,"--AREN: input a new gray brick\n") ;
00206    }
00207 
00208    
00209 
00210    if( ar->nx > 0 &&
00211        ( ar->nx != grim->nx || ar->ny != grim->ny || ar->nz != grim->nz ) ){
00212 
00213       ar->opim = NULL ;
00214       if( ar->vox != NULL ){ free(ar->vox) ; ar->vox = NULL ; }
00215 
00216       if( ar->verbose )
00217          fprintf(stderr,"--AREN: new gray brick changes volume dimensions\n"
00218                         "        nx:%d->%d  ny:%d->%d  nz:%d->%d\n",
00219                         ar->nx,grim->nx , ar->ny,grim->ny , ar->nz,grim->nz ) ;
00220    }
00221 
00222    
00223 
00224    ar->grim = grim ;
00225    ar->nx   = grim->nx ;
00226    ar->ny   = grim->ny ;
00227    ar->nz   = grim->nz ; nvox = ar->nx * ar->ny * ar->nz ;
00228 
00229    
00230 
00231    if( ar->vox == NULL ){
00232       ar->newvox = newvox = 1 ;
00233       ar->vox = (rgbvox *) malloc( sizeof(rgbvox) * nvox ) ;
00234       if( ar->vox == NULL ){
00235          fprintf(stderr,"**AREN: can't malloc workspace with new gray brick\n") ;
00236          return -1 ;
00237       } else if( ar->verbose ){
00238          fprintf(stderr,"--AREN: allocated new voxel array\n") ;
00239       }
00240    }
00241 
00242    
00243 
00244    gvox = ar->vox ;
00245    gar  = MRI_BYTE_PTR(grim) ;
00246    for( ii=0 ; ii < nvox ; ii++ ) gvox[ii].rgb = (unsigned short) gar[ii] ;
00247 
00248    ar->newdata = 1 ;
00249    return 0 ;
00250 }
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 int AREN_set_opabrick( void * ah , MRI_IMAGE * opim )
00260 {
00261    AREN_stuff * ar = (AREN_stuff *) ah ;
00262    int nvox,ii , newvox ;
00263    byte    * gar ;
00264    rgbvox  * rvox ;
00265 
00266    
00267 
00268    if( !ISVALID_AREN(ar) || opim == NULL || opim->kind != MRI_byte ) return -1 ;
00269 
00270    if( opim->nx < 3 || opim->ny < 3 || opim->nz < 3 ){
00271       fprintf(stderr,"**AREN: illegal dimensions for an opacity brick\n") ;
00272       return -1 ;
00273    }
00274 
00275    
00276 
00277    if( ar->nx > 0 &&
00278        ( ar->nx != opim->nx || ar->ny != opim->ny || ar->nz != opim->nz ) ){
00279 
00280       ar->grim = ar->rim = ar->gim = ar->bim = NULL ;
00281       if( ar->vox != NULL ){ free(ar->vox) ; ar->vox = NULL ; }
00282 
00283       if( ar->verbose )
00284          fprintf(stderr,"--AREN: new opacity brick changes volume dimensions\n"
00285                         "        nx:%d->%d  ny:%d->%d  nz:%d->%d\n",
00286                         ar->nx,opim->nx , ar->ny,opim->ny , ar->nz,opim->nz ) ;
00287    } else {
00288       if( ar->verbose )
00289          fprintf(stderr,"--AREN: new opacity brick\n") ;
00290    }
00291 
00292    
00293 
00294    ar->opim = opim ;
00295    ar->nx   = opim->nx ;
00296    ar->ny   = opim->ny ;
00297    ar->nz   = opim->nz ; nvox = ar->nx * ar->ny * ar->nz ;
00298 
00299    
00300 
00301    if( ar->vox == NULL ){
00302       ar->newvox = newvox = 1 ;
00303       ar->vox = (rgbvox *) malloc( sizeof(rgbvox) * nvox ) ;
00304       if( ar->vox == NULL ){
00305          fprintf(stderr,"**AREN: can't malloc workspace with new opacity brick\n") ;
00306          return -1 ;
00307       } else if( ar->verbose ){
00308          fprintf(stderr,"--AREN: allocated new voxel array\n") ;
00309       }
00310    }
00311 
00312    
00313 
00314    gar  = MRI_BYTE_PTR(ar->opim) ;
00315    rvox = ar->vox ;
00316    for( ii=0 ; ii < nvox ; ii++ ) rvox[ii].alpha = (unsigned short) gar[ii] ;
00317 
00318    ar->newdata = 1 ;
00319    return 0 ;
00320 }
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 int AREN_set_rgbbricks( void * ah , MRI_IMAGE *rim, MRI_IMAGE *gim, MRI_IMAGE *bim )
00330 {
00331    AREN_stuff * ar = (AREN_stuff *) ah ;
00332    int newvox=0 , nvox,ii ;
00333    byte    * rar , * gar , * bar ;
00334    rgbvox  * rvox ;
00335    byte      rb,gb,bb ;
00336 
00337    
00338 
00339    if( rim == NULL || rim->kind != MRI_byte ||
00340        gim == NULL || gim->kind != MRI_byte ||
00341        bim == NULL || bim->kind != MRI_byte || !ISVALID_AREN(ar) ) return -1 ;
00342 
00343    if( rim->nx < 3 || rim->ny < 3 || rim->nz < 3 ){
00344       fprintf(stderr,"**AREN: illegal dimensions for a color brick\n") ; return -1 ;
00345    }
00346 
00347    if( gim->nx != rim->nx || gim->ny != rim->ny || gim->nz != rim->nz ){
00348       fprintf(stderr,"**AREN: green & red rgb bricks don't match\n") ; return -1 ;
00349    }
00350 
00351    if( bim->nx != rim->nx || bim->ny != rim->ny || bim->nz != rim->nz ){
00352       fprintf(stderr,"**AREN: blue & red rgb bricks don't match\n") ; return -1 ;
00353    }
00354 
00355    
00356 
00357    if( ar->grim != NULL ){
00358       ar->grim = NULL ;
00359       if( ar->verbose )
00360          fprintf(stderr,"--AREN: switching from gray brick to color bricks\n") ;
00361    } else {
00362       if( ar->verbose )
00363          fprintf(stderr,"--AREN: input new color bricks\n") ;
00364    }
00365 
00366    
00367 
00368    if( ar->nx > 0 &&
00369        ( ar->nx != rim->nx || ar->ny != rim->ny || ar->nz != rim->nz ) ){
00370 
00371       ar->opim = NULL ;
00372       if( ar->vox != NULL ){ free(ar->vox) ; ar->vox = NULL ; }
00373 
00374       if( ar->verbose )
00375          fprintf(stderr,"--AREN: new color bricks change volume dimensions\n"
00376                         "        nx:%d->%d  ny:%d->%d  nz:%d->%d\n",
00377                         ar->nx,rim->nx , ar->ny,rim->ny , ar->nz,rim->nz ) ;
00378    }
00379 
00380    
00381 
00382    ar->rim = rim ; ar->gim = gim ; ar->bim = bim ;
00383    ar->nx  = rim->nx ;
00384    ar->ny  = rim->ny ;
00385    ar->nz  = rim->nz ; nvox = ar->nx * ar->ny * ar->nz ;
00386 
00387    
00388 
00389    if( ar->vox == NULL ){
00390       ar->newvox = newvox = 1 ;
00391       ar->vox = (rgbvox *) malloc( sizeof(rgbvox) * nvox ) ;
00392       if( ar->vox == NULL ){
00393          fprintf(stderr,"**AREN: can't malloc workspace with new color bricks\n") ;
00394          return -1 ;
00395       } else if( ar->verbose ){
00396          fprintf(stderr,"--AREN: allocated new voxel array\n") ;
00397       }
00398    }
00399 
00400    
00401 
00402    rvox = ar->vox ;
00403    rar  = MRI_BYTE_PTR(rim) ;
00404    gar  = MRI_BYTE_PTR(gim) ;
00405    bar  = MRI_BYTE_PTR(bim) ;
00406    for( ii=0 ; ii < nvox ; ii++ ){
00407       rb = EIGHT_TO_FIVE(rar[ii]) ;
00408       gb = EIGHT_TO_FIVE(gar[ii]) ;
00409       bb = EIGHT_TO_FIVE(bar[ii]) ;
00410 
00411       if( rb == gb && rb == bb ){
00412          rvox[ii].rgb = MAX_COLORS + rar[ii] ;         
00413       } else {
00414          rvox[ii].rgb = FIVE_to_short( rb , gb, bb ) ; 
00415       }
00416    }
00417 
00418    ar->newdata = 1 ;
00419    return 0 ;
00420 }
00421 
00422 
00423 
00424 
00425 
00426 void AREN_set_viewpoint( void * ah , float theta , float phi )
00427 {
00428    AREN_stuff * ar = (AREN_stuff *) ah ;
00429 
00430    if( !ISVALID_AREN(ar) ) return ;
00431 
00432    ar->theta = theta ; ar->phi = phi ;
00433 
00434    vpCurrentMatrix( ar->vpc , VP_VIEW ) ;
00435    vpIdentityMatrix( ar->vpc ) ;
00436    vpRotate( ar->vpc , VP_Y_AXIS , theta ) ;
00437    vpRotate( ar->vpc , VP_X_AXIS , phi   ) ;
00438 
00439    if( ar->verbose )
00440       fprintf(stderr,"--AREN: set theta=%f  phi=%f\n",theta,phi) ;
00441 
00442    return ;
00443 }
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 void AREN_set_size( void * ah , float sx , float sy , float sz )
00455 {
00456 #if 0
00457    AREN_stuff * ar = (AREN_stuff *) ah ;
00458    float mmm ;
00459 
00460    if( !ISVALID_AREN(ar) ) return ;
00461 
00462    sx = fabs(sx) ; if( sx == 0.0 ) sx = 1.0 ;  
00463    sy = fabs(sy) ; if( sy == 0.0 ) sy = 1.0 ;
00464    sz = fabs(sz) ; if( sz == 0.0 ) sz = 1.0 ;
00465 
00466    mmm = sx ;
00467    if( mmm < sy ) mmm = sy ;
00468    if( mmm < sz ) mmm = sz ;  
00469 
00470    ar->sx = sx / mmm ;        
00471    ar->sy = sy / mmm ;
00472    ar->sz = sz / mmm ;
00473 
00474    vpCurrentMatrix( ar->vpc , VP_MODEL ) ;  
00475    vpIdentityMatrix( ar->vpc ) ;
00476    vpScale( ar->vpc , sx , sy , sz ) ;
00477 
00478    if( ar->verbose )
00479       fprintf(stderr,"--AREN: set scale factors = %f %f %f\n",ar->sx,ar->sy,ar->sz) ;
00480 #endif
00481 
00482    return ;
00483 }
00484 
00485 #undef USE_CALLBACKS
00486 #ifdef USE_CALLBACKS
00487 
00488 
00489 
00490 
00491 
00492 static int ncall = 0 ;
00493 
00494 void AREN_grayfunc( void * vp , float * g , void * cd )
00495 {
00496    rgbvox * rv = (rgbvox *) vp ;
00497 
00498    *g = AREN_graytable[ rv->rgb ] ;
00499 
00500 #if 0
00501    ncall++ ;
00502    if( ncall%1000 == 0 && rv->rgb > 0 )
00503       fprintf(stderr,"Grayfunc: rgb=%d g=%f\n",(int)(rv->rgb) , *g ) ;
00504 #endif
00505 
00506    return ;
00507 }
00508 
00509 void AREN_colorfunc( void * vp , float * r , float * g , float * b , void * cd )
00510 {
00511    rgbvox * rv = (rgbvox *) vp ;
00512    *r = AREN_colortable[ 3*(rv->rgb)   ] ;
00513    *g = AREN_colortable[ 3*(rv->rgb)+1 ] ;
00514    *b = AREN_colortable[ 3*(rv->rgb)+2 ] ;
00515 
00516 #if 0
00517    ncall++ ;
00518    if( ncall%1000 == 0 && rv->rgb > 0 )
00519       fprintf(stderr,"Colorfunc: rgb=%d r=%f g=%f b=%f\n",
00520                      (int)(rv->rgb) , *r,*g,*b ) ;
00521 #endif
00522 
00523    return ;
00524 }
00525 #endif 
00526 
00527 
00528 
00529 
00530 
00531 
00532 
00533 
00534 MRI_IMAGE * AREN_render( void * ah , int npix )
00535 {
00536    AREN_stuff * ar = (AREN_stuff *) ah ;
00537    int isgray , isrgb ;
00538    MRI_IMAGE * im ;
00539    byte * imar ;
00540    vpResult fred ;
00541 
00542    
00543 
00544    if( !ISVALID_AREN(ar) ) return NULL ;
00545 
00546    if( npix < 16 ){
00547       fprintf(stderr,"**AREN: attempt to render with less than 16 pixels!\n") ;
00548       return NULL ;
00549    }
00550 
00551    isgray = (ar->grim != NULL) ;
00552    isrgb  = (ar->rim  != NULL) ;
00553 
00554    if( isgray && isrgb ){
00555       fprintf(stderr,"**AREN: attempt to render gray and color simultaneously?\n");
00556       return NULL ;
00557    }
00558 
00559    if( (!isgray && !isrgb) || ar->vox == NULL ){
00560       fprintf(stderr,"**AREN: attempt to render without data being loaded!\n") ;
00561       return NULL ;
00562    }
00563 
00564    if( ar->opim == NULL ){
00565       fprintf(stderr,"**AREN: attempt to render without opacity being loaded!\n") ;
00566       return NULL ;
00567    }
00568 
00569    if( ar->nx < 3 || ar->ny < 3 || ar->nz < 3 ){
00570       fprintf(stderr,"**AREN: attempt to render without initialization!\n") ;
00571       return NULL ;
00572    }
00573 
00574    
00575 
00576    if( ar->newvox ){
00577       int nvox = ar->nx * ar->ny * ar->nz ;
00578       rgbvox vv , *rv = &vv ;
00579 
00580       if( ar->verbose )
00581          fprintf(stderr,"--AREN: setting up new voxel array\n") ;
00582 
00583       
00584 
00585       fred = vpSetVolumeSize( ar->vpc , ar->nx , ar->ny , ar->nz ) ;
00586       if( fred != VP_OK ){
00587          fprintf(stderr,"**AREN: vpSetVolumeSize failed: code=%d\n",(int)fred) ;
00588          return NULL ;
00589       }
00590 
00591       
00592 
00593       fred = vpSetVoxelSize( ar->vpc , sizeof(rgbvox) , 2 , 1 , 1 ) ;
00594       if( fred != VP_OK ){
00595          fprintf(stderr,"**AREN: vpSetVoxelSize failed: code=%d\n",(int)fred) ;
00596          return NULL ;
00597       }
00598 
00599       
00600 
00601       if( isgray ){
00602 
00603          
00604 
00605          fred = vpSetVoxelField( ar->vpc, 0, sizeof(short),
00606                                  vpFieldOffset(rv,rgb), MAX_GRAYS-1 );
00607          if( fred != VP_OK ){
00608             fprintf(stderr,"**AREN: vpSetVoxelField(0) failed: code=%d\n",(int)fred) ;
00609             return NULL ;
00610          }
00611 
00612          
00613 
00614          fred = vpSetVoxelField( ar->vpc, 1, sizeof(short),
00615                                  vpFieldOffset(rv,alpha), MAX_GRAYS-1 );
00616          if( fred != VP_OK ){
00617             fprintf(stderr,"**AREN: vpSetVoxelField(1) failed: code=%d\n",(int)fred) ;
00618             return NULL ;
00619          }
00620 
00621          
00622 
00623          fred = vpSetRawVoxels( ar->vpc , ar->vox ,
00624                                 sizeof(rgbvox)*nvox ,
00625                                 sizeof(rgbvox) ,
00626                                 sizeof(rgbvox)*(ar->nx) ,
00627                                 sizeof(rgbvox)*(ar->nx * ar->ny) ) ;
00628          if( fred != VP_OK ){
00629             fprintf(stderr,"**AREN: vpSetRawVoxels failed: code=%d\n",(int)fred) ;
00630             return NULL ;
00631          }
00632 
00633 #ifndef USE_CALLBACKS
00634 
00635          
00636 
00637          fred = vpSetLookupShader( ar->vpc , 1 , 1 , 0 ,
00638                                    AREN_graytable , sizeof(float)*MAX_GRAYS ,
00639                                    0 , NULL , 0 ) ;
00640          if( fred != VP_OK ){
00641             fprintf(stderr,"**AREN: vpSetLookupShader failed: code=%d\n",(int)fred) ;
00642             return NULL ;
00643          }
00644 #else
00645          fred = vpSetCallback( ar->vpc , VP_GRAY_SHADE_FUNC , AREN_grayfunc ) ;
00646          if( fred != VP_OK ){
00647             fprintf(stderr,"**AREN: vpSetCallback(GRAY) failed: code=%d\n",(int)fred) ;
00648             return NULL ;
00649          }
00650 #endif
00651 
00652       
00653 
00654       } else if( isrgb ){
00655 
00656          
00657 
00658          fred = vpSetVoxelField( ar->vpc, 0, sizeof(short),
00659                                  vpFieldOffset(rv,rgb), TOT_COLORS-1 );
00660          if( fred != VP_OK ){
00661             fprintf(stderr,"**AREN: vpSetVoxelField(0) failed: code=%d\n",(int)fred) ;
00662             return NULL ;
00663          }
00664 
00665          
00666 
00667          fred = vpSetVoxelField( ar->vpc, 1, sizeof(short) ,
00668                                  vpFieldOffset(rv,alpha), MAX_GRAYS-1 );
00669          if( fred != VP_OK ){
00670             fprintf(stderr,"**AREN: vpSetVoxelField(1) failed: code=%d\n",(int)fred) ;
00671             return NULL ;
00672          }
00673 
00674          
00675 
00676          fred = vpSetRawVoxels( ar->vpc , ar->vox ,
00677                                 sizeof(rgbvox)*nvox ,
00678                                 sizeof(rgbvox) ,
00679                                 sizeof(rgbvox)*(ar->nx) ,
00680                                 sizeof(rgbvox)*(ar->nx * ar->ny) ) ;
00681          if( fred != VP_OK ){
00682             fprintf(stderr,"**AREN: vpSetRawVoxels failed: code=%d\n",(int)fred) ;
00683             return NULL ;
00684          }
00685 
00686 #ifndef USE_CALLBACKS
00687 
00688          
00689 
00690          fred = vpSetLookupShader( ar->vpc , 3 , 1 , 0 ,
00691                                    AREN_colortable , sizeof(float)*TOT_COLORS*3 ,
00692                                    0 , NULL , 0 ) ;
00693          if( fred != VP_OK ){
00694             fprintf(stderr,"**AREN: vpSetLookupShader failed: code=%d\n",(int)fred) ;
00695             return NULL ;
00696          }
00697 #else
00698          fred = vpSetCallback( ar->vpc , VP_RGB_SHADE_FUNC , AREN_colorfunc ) ;
00699          if( fred != VP_OK ){
00700             fprintf(stderr,"**AREN: vpSetCallback(COLOR) failed: code=%d\n",(int)fred) ;
00701             return NULL ;
00702          }
00703 #endif
00704       }
00705 
00706       
00707 
00708       fred = vpSetClassifierTable( ar->vpc, 0, 1, AREN_opatable, sizeof(float)*MAX_GRAYS ) ;
00709       if( fred != VP_OK ){
00710          fprintf(stderr,"**AREN: vpSetClassifierTable failed: code=%d\n",(int)fred) ;
00711          return NULL ;
00712       }
00713 
00714       
00715 
00716       fred = vpMinMaxOctreeThreshold( ar->vpc , 0 , 12 ) ;
00717       if( fred != VP_OK ){
00718          fprintf(stderr,"**AREN: vpMinMaxOctreeThreshold failed: code=%d\n",(int)fred) ;
00719          return NULL ;
00720       }
00721 
00722       ar->newvox = 0 ;
00723    }
00724 
00725    
00726 
00727 #if 1
00728    vpSetd( ar->vpc , VP_MAX_RAY_OPACITY   , 0.95 ) ;
00729    vpSetd( ar->vpc , VP_MIN_VOXEL_OPACITY , 0.05 ) ;
00730 #endif
00731 
00732    if( ar->newdata ){
00733 
00734 #undef USE_CLASSIFIED  
00735 
00736 #ifndef USE_CLASSIFIED
00737       if( ar->verbose )
00738          fprintf(stderr,"--AREN: computing octree\n") ;
00739 
00740       
00741 
00742       fred = vpCreateMinMaxOctree( ar->vpc , 0 , 4 ) ;
00743       if( fred != VP_OK ){
00744          fprintf(stderr,"**AREN: vpCreateMinMaxOctree failed: code=%d\n",(int)fred) ;
00745          return NULL ;
00746       }
00747 #else
00748       if( ar->verbose )
00749          fprintf(stderr,"--AREN: computing classified volume\n") ;
00750 
00751       
00752 
00753       fred = vpClassifyVolume( ar->vpc ) ;
00754       if( fred != VP_OK ){
00755          fprintf(stderr,"**AREN: vpClassifyVolume failed: code=%d\n",(int)fred) ;
00756          return NULL ;
00757       }
00758 #endif
00759 
00760       ar->newdata = 0 ;
00761    }
00762 
00763    
00764 
00765 #undef GET_ALPHA  
00766 
00767    if( isgray ){
00768       im   = mri_new( npix , npix , MRI_byte ) ;
00769       imar = MRI_BYTE_PTR(im) ;
00770 #ifndef GET_ALPHA
00771       vpSetImage( ar->vpc , imar , npix,npix,npix , VP_LUMINANCE ) ;
00772 #else
00773       vpSetImage( ar->vpc , imar , npix,npix,npix , VP_ALPHA ) ;
00774 #endif
00775    } else if( isrgb ){
00776 #ifndef GET_ALPHA
00777       im   = mri_new( npix , npix , MRI_rgb ) ;
00778       imar = MRI_RGB_PTR(im) ;
00779       vpSetImage( ar->vpc , imar , npix,npix,3*npix , VP_RGB ) ;
00780 #else
00781       im   = mri_new( npix , npix , MRI_byte ) ;
00782       imar = MRI_BYTE_PTR(im) ;
00783       vpSetImage( ar->vpc , imar , npix,npix,npix , VP_ALPHA ) ;
00784 #endif
00785    }
00786 
00787    if( ar->verbose )
00788       fprintf(stderr,"--AREN: rendering image\n") ;
00789 
00790 #ifdef USE_CLASSIFIED
00791    fred = vpRenderClassifiedVolume(ar->vpc) ;
00792    if( fred != VP_OK ){
00793       fprintf(stderr,"**AREN: vpRenderClassifiedVolume failed: code=%d\n",(int)fred) ;
00794       mri_free(im) ; return NULL ;
00795    }
00796 #else
00797    fred = vpRenderRawVolume(ar->vpc) ;
00798    if( fred != VP_OK ){
00799       fprintf(stderr,"**AREN: vpRenderRawVolume failed: code=%d\n",(int)fred) ;
00800       mri_free(im) ; return NULL ;
00801    }
00802 #endif
00803 
00804    return im ;
00805 }