コード例 #1
0
ファイル: volume.c プロジェクト: drafnel/Vis5d
/*
 * Render the volume described by the given volume struct.
 * Return:  1 = ok
 *          0 = bad volume struct.
 */
static int render_volume( Context ctx,
                          struct volume *v, unsigned int ctable[] )
{
   register int rows, cols, slices, i, j, s;
	register int rows1, cols1;
   register uint_1 *cp0, *cp1;
   register float *vp0, *vp1;
	int	fastdraw;
	int	stride = 1;
   if (!v || !v->slices)
      return 0;


#if defined (HAVE_SGI_GL) || defined (DENALI)
   lmcolor( LMC_COLOR );             /* no shading */
   blendfunction( BF_SA, BF_MSA );   /* enable alpha blending */
#endif
#ifdef HAVE_OPENGL
   glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
   glEnable( GL_BLEND );
   check_gl_error( "render_volume (glBlendFunc)" );
#endif

   /* put rows, cols, slices values into registers */
   rows = v->rows-1;  /* number of quad strips = number of data rows - 1 */
   cols = v->cols;
   slices = v->slices;
   /* setup color and vertex pointers */
   cp0 = v->index;
   cp1 = cp0 + cols;
   vp0 = v->vertex;
   vp1 = vp0 + cols * 3;   /* 3 floats per vertex */

/* MJK 12.15.98 */
#ifdef HAVE_PEX

   rows++;
   j = rows * cols;

   for (s = 0; s < slices; s++)
   {
      draw_volume_quadmesh (rows, cols, vp0, cp0, ctable);
      vp0 += j * 3;
      cp0 += j;
   }
   return 1;
#endif

   vis5d_check_fastdraw(ctx->dpy_ctx->dpy_context_index, &fastdraw);

   if (fastdraw) {
	  stride = ctx->dpy_ctx->VStride;
   } 
	/* sanity check */
	if(stride<=0)
	  stride = 1;


   /*
   ** adjust rows and cols based on stride. N.B. appears to be one more
   ** row than we actually use
   */
   rows1 = (rows + 1 - 1) / stride;
   cols1 = ((cols - 1) / stride) + 1;
  

	/* loop over slices */
   for (s=0;s<slices;s+=stride) {

     cp0 = v->index + (s * rows * cols) +
		 (s * cols);	/* skip a row after each slice */

     vp0 = v->vertex + (s * rows * cols * 3) +
		 (s * cols * 3);	/* skip a row after each slice */

     cp1 = cp0 + (cols * stride);
     vp1 = vp0 + (cols * stride * 3);   /* 3 floats per vertex */
  
	  /* draw 'rows' quadrilateral strips */
	  for (i=0;i<rows1;i++) {
#if defined(SGI_GL) || defined(DENALI)
		 bgnqstrip();
		 for (j=0;j<cols1;j++) {
			cpack( ctable[cp0[i*stride*cols+j*stride]] );
			v3f( &vp0[i*stride*cols+j*stride] );
			cpack( ctable[cp1[i*stride*cols+j*stride]] );
			v3f( &vp1[i*stride*cols+j*stride] );
		 }
		 endqstrip();
#endif
#ifdef HAVE_OPENGL
		 glBegin( GL_QUAD_STRIP );
		 for (j=0;j<cols1;j++) {
			glColor4ubv( (GLubyte *) &ctable[cp0[i*stride*cols+j*stride]] );
			glVertex3fv( &vp0[(i*stride*cols+j*stride)*3] );
			
			glColor4ubv( (GLubyte *) &ctable[cp1[i*stride*cols+j*stride]] );
			glVertex3fv( &vp1[(i*stride*cols+j*stride)*3] );
		 }
		 glEnd();
#endif
	  }
	  
	}
	
#if defined(HAVE_SGI_GL) || defined(DENALI)
   blendfunction( BF_ONE, BF_ZERO );  /* disable alpha blending */
#endif
#ifdef HAVE_OPENGL
   glDisable( GL_BLEND );
   check_gl_error( "render_volume (glDisable)" );

#endif
   return 1;
}
コード例 #2
0
/*-------------------------------------------------------------------------
 * makeMesh - make the mesh of points on lattice
 *-------------------------------------------------------------------------
 */
void
_SoNurbsSurfaceEvaluator::makeMesh( long umin, long umax, long vmin, long vmax )
{
    assert( umax - umin >= 0 );
    assert( vmax - vmin >= 0 );

    REAL domain[2];
    REAL v0;
    int vstart;

    REAL v1 = vs + dvs * vmin;

    int lastv = (int) (vmax + 1);
    for( int gridv1 = (int) (vmin)+1; gridv1 != lastv; gridv1++ ) {

  v0 = v1;
  /* strength reduction == roundoff error */
  v1 = vs + dvs * gridv1;  

  if( equal(v0, vvals[1]) ) {
      if( ! equal( v1, vvals[0]) ) {
    setv( v1, 0 );
      }
      vstart = 1;
  } else if( equal(v0, vvals[0]) ) {
      if( ! equal(v1, vvals[1]) ) {
          setv( v1, 1 );
      }
      vstart = 0;
  } else if( equal(v1, vvals[1]) ) {
      setv( v0, 0 );
      vstart = 0;
  } else {
      setv( v0, 1 );
      setv( v1, 0 );
      vstart = 1;
  }

  assert( equal(vvals[vstart],v0) );
  assert( equal(vvals[1-vstart],v1) );

  bgnqstrip();
  if( vstart == 1 ) {
      int lastu = (int) (umax + 1);
      int gridi = (int) umin;
      for( int gridu = gridi++; gridu != lastu; gridu = gridi++ ) {

    /* strength reduction == roundoff error */
    domain[0] = us + dus * gridu;

    domain[1] = vvals[1];
    compute( domain, 1, gridi );

    domain[1] = vvals[0];
    compute( domain, 0, gridi );
      }
  } else {
      int lastu = (int) (umax + 1);
      int gridi = (int) umin;
      for( int gridu = gridi++; gridu != lastu; gridu = gridi++ ) {
    /* strength reduction == roundoff error */
    domain[0] = us + dus * gridu;

    domain[1] = vvals[0];
    compute( domain, 0, gridi );

    domain[1] = vvals[1];
    compute( domain, 1, gridi );
      }
  }
  endqstrip();
    }
}