/* * 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; }
/*------------------------------------------------------------------------- * 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(); } }