493 lines
12 KiB
C++
493 lines
12 KiB
C++
/**************************************************************************
|
|
* *
|
|
* Copyright (C) 1992, Silicon Graphics, Inc. *
|
|
* *
|
|
* These coded instructions, statements, and computer programs contain *
|
|
* unpublished proprietary information of Silicon Graphics, Inc., and *
|
|
* are protected by Federal copyright law. They may not be disclosed *
|
|
* to third parties or copied or duplicated in any form, in whole or *
|
|
* in part, without the prior written consent of Silicon Graphics, Inc. *
|
|
* *
|
|
**************************************************************************/
|
|
|
|
/*
|
|
* backend.c++ - $Revision: 1.5 $
|
|
* Derrick Burns - 1991
|
|
*/
|
|
|
|
/* Bezier surface backend
|
|
- interprets display mode (wireframe,shaded,...)
|
|
*/
|
|
|
|
#include "glimport.h"
|
|
#include "mystdio.h"
|
|
#include "backend.h"
|
|
#include "basiccrv.h"
|
|
#include "basicsur.h"
|
|
#include "nurbscon.h"
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* bgnsurf - preamble to surface definition and evaluations
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::bgnsurf( int wiretris, int wirequads, long nuid )
|
|
{
|
|
#ifndef NOWIREFRAME
|
|
wireframetris = wiretris;
|
|
wireframequads = wirequads;
|
|
#endif
|
|
surfaceEvaluator.bgnmap2f( nuid );
|
|
}
|
|
|
|
void
|
|
Backend::patch( REAL ulo, REAL uhi, REAL vlo, REAL vhi )
|
|
{
|
|
surfaceEvaluator.domain2f( ulo, uhi, vlo, vhi );
|
|
}
|
|
|
|
void
|
|
Backend::surfbbox( long type, REAL *from, REAL *to )
|
|
{
|
|
surfaceEvaluator.range2f( type, from, to );
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* surfpts - pass a desription of a surface map
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::surfpts(
|
|
long type, /* geometry, color, texture, normal */
|
|
REAL *pts, /* control points */
|
|
long ustride, /* distance to next point in u direction */
|
|
long vstride, /* distance to next point in v direction */
|
|
int uorder, /* u parametric order */
|
|
int vorder, /* v parametric order */
|
|
REAL ulo, /* u lower bound */
|
|
REAL uhi, /* u upper bound */
|
|
REAL vlo, /* v lower bound */
|
|
REAL vhi ) /* v upper bound */
|
|
{
|
|
surfaceEvaluator.map2f( type,ulo,uhi,ustride,uorder,vlo,vhi,vstride,vorder,pts );
|
|
surfaceEvaluator.enable( type );
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* surfgrid - define a lattice of points with origin and offset
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::surfgrid( REAL u0, REAL u1, long nu, REAL v0, REAL v1, long nv )
|
|
{
|
|
surfaceEvaluator.mapgrid2f( nu, u0, u1, nv, v0, v1 );
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* surfmesh - evaluate a mesh of points on lattice
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::surfmesh( long u, long v, long n, long m )
|
|
{
|
|
#ifndef NOWIREFRAME
|
|
if( wireframequads ) {
|
|
long v0, v1;
|
|
long u0f = u, u1f = u+n;
|
|
long v0f = v, v1f = v+m;
|
|
long parity = (u & 1);
|
|
|
|
for( v0 = v0f, v1 = v0f++ ; v0<v1f; v0 = v1, v1++ ) {
|
|
surfaceEvaluator.bgnline();
|
|
for( long u = u0f; u<=u1f; u++ ) {
|
|
if( parity ) {
|
|
surfaceEvaluator.evalpoint2i( u, v0 );
|
|
surfaceEvaluator.evalpoint2i( u, v1 );
|
|
} else {
|
|
surfaceEvaluator.evalpoint2i( u, v1 );
|
|
surfaceEvaluator.evalpoint2i( u, v0 );
|
|
}
|
|
parity = 1 - parity;
|
|
}
|
|
surfaceEvaluator.endline();
|
|
}
|
|
} else {
|
|
surfaceEvaluator.mapmesh2f( N_MESHFILL, u, u+n, v, v+m );
|
|
}
|
|
#else
|
|
if( wireframequads ) {
|
|
|
|
surfaceEvaluator.mapmesh2f( N_MESHLINE, u, u+n, v, v+m );
|
|
} else {
|
|
|
|
surfaceEvaluator.mapmesh2f( N_MESHFILL, u, u+n, v, v+m );
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* endsurf - postamble to surface
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::endsurf( void )
|
|
{
|
|
surfaceEvaluator.endmap2f();
|
|
}
|
|
|
|
/***************************************/
|
|
void
|
|
Backend::bgntfan( void )
|
|
{
|
|
// surfaceEvaluator.bgntfan();
|
|
|
|
}
|
|
|
|
void
|
|
Backend::endtfan( void )
|
|
{
|
|
// surfaceEvaluator.endtfan();
|
|
}
|
|
|
|
void
|
|
Backend::bgnqstrip( void )
|
|
{
|
|
/*
|
|
if(wireframequads)
|
|
surfaceEvaluator.polymode( N_MESHLINE );
|
|
else
|
|
surfaceEvaluator.polymode( N_MESHFILL );
|
|
*/
|
|
surfaceEvaluator.bgnqstrip();
|
|
|
|
}
|
|
|
|
void
|
|
Backend::endqstrip( void )
|
|
{
|
|
surfaceEvaluator.endqstrip();
|
|
}
|
|
|
|
void
|
|
Backend::evalUStrip(int n_upper, REAL v_upper, REAL* upper_val,
|
|
int n_lower, REAL v_lower, REAL* lower_val
|
|
)
|
|
{
|
|
}
|
|
|
|
void
|
|
Backend::evalVStrip(int n_left, REAL u_left, REAL* left_val,
|
|
int n_right, REAL u_right, REAL* right_val
|
|
)
|
|
{
|
|
}
|
|
|
|
/***************************************/
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* bgntmesh - preamble to a triangle mesh
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::bgntmesh( char * )
|
|
{
|
|
#ifndef NOWIREFRAME
|
|
|
|
meshindex = 0; /* I think these need to be initialized to zero */
|
|
npts = 0;
|
|
|
|
if( !wireframetris ) {
|
|
surfaceEvaluator.bgntmesh();
|
|
}
|
|
#else
|
|
|
|
if( wireframetris ) {
|
|
surfaceEvaluator.polymode( N_MESHLINE );
|
|
surfaceEvaluator.bgntmesh();
|
|
} else {
|
|
surfaceEvaluator.polymode( N_MESHFILL );
|
|
surfaceEvaluator.bgntmesh();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void
|
|
Backend::tmeshvert( GridTrimVertex *v )
|
|
{
|
|
if( v->isGridVert() ) {
|
|
tmeshvert( v->g );
|
|
} else {
|
|
tmeshvert( v->t );
|
|
}
|
|
}
|
|
|
|
void
|
|
Backend::tmeshvertNOGE(TrimVertex *t)
|
|
{
|
|
#ifdef USE_OPTTT
|
|
// surfaceEvaluator.inDoEvalCoord2NOGE( t->param[0], t->param[1], t->cache_point, t->cache_normal);
|
|
#endif
|
|
}
|
|
|
|
//opt for a line with the same u.
|
|
void
|
|
Backend::tmeshvertNOGE_BU(TrimVertex *t)
|
|
{
|
|
#ifdef USE_OPTTT
|
|
// surfaceEvaluator.inDoEvalCoord2NOGE_BU( t->param[0], t->param[1], t->cache_point, t->cache_normal);
|
|
#endif
|
|
}
|
|
|
|
//opt for a line with the same v.
|
|
void
|
|
Backend::tmeshvertNOGE_BV(TrimVertex *t)
|
|
{
|
|
#ifdef USE_OPTTT
|
|
// surfaceEvaluator.inDoEvalCoord2NOGE_BV( t->param[0], t->param[1], t->cache_point, t->cache_normal);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
Backend::preEvaluateBU(REAL u)
|
|
{
|
|
// surfaceEvaluator.inPreEvaluateBU_intfac(u);
|
|
}
|
|
|
|
void
|
|
Backend::preEvaluateBV(REAL v)
|
|
{
|
|
// surfaceEvaluator.inPreEvaluateBV_intfac(v);
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* tmeshvert - evaluate a point on a triangle mesh
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::tmeshvert( TrimVertex *t )
|
|
{
|
|
|
|
const long nuid = t->nuid;
|
|
const REAL u = t->param[0];
|
|
const REAL v = t->param[1];
|
|
|
|
#ifndef NOWIREFRAME
|
|
npts++;
|
|
if( wireframetris ) {
|
|
if( npts >= 3 ) {
|
|
surfaceEvaluator.bgnclosedline();
|
|
if( mesh[0][2] == 0 )
|
|
surfaceEvaluator.evalcoord2f( mesh[0][3], mesh[0][0], mesh[0][1] );
|
|
else
|
|
surfaceEvaluator.evalpoint2i( (long) mesh[0][0], (long) mesh[0][1] );
|
|
if( mesh[1][2] == 0 )
|
|
surfaceEvaluator.evalcoord2f( mesh[1][3], mesh[1][0], mesh[1][1] );
|
|
else
|
|
surfaceEvaluator.evalpoint2i( (long) mesh[1][0], (long) mesh[1][1] );
|
|
surfaceEvaluator.evalcoord2f( nuid, u, v );
|
|
surfaceEvaluator.endclosedline();
|
|
}
|
|
mesh[meshindex][0] = u;
|
|
mesh[meshindex][1] = v;
|
|
mesh[meshindex][2] = 0;
|
|
mesh[meshindex][3] = nuid;
|
|
meshindex = (meshindex+1) % 2;
|
|
} else {
|
|
surfaceEvaluator.evalcoord2f( nuid, u, v );
|
|
}
|
|
#else
|
|
surfaceEvaluator.evalcoord2f( nuid, u, v );
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* tmeshvert - evaluate a grid point of a triangle mesh
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::tmeshvert( GridVertex *g )
|
|
{
|
|
const long u = g->gparam[0];
|
|
const long v = g->gparam[1];
|
|
|
|
#ifndef NOWIREFRAME
|
|
npts++;
|
|
if( wireframetris ) {
|
|
if( npts >= 3 ) {
|
|
surfaceEvaluator.bgnclosedline();
|
|
if( mesh[0][2] == 0 )
|
|
surfaceEvaluator.evalcoord2f( (long) mesh[0][3], mesh[0][0], mesh[0][1] );
|
|
else
|
|
surfaceEvaluator.evalpoint2i( (long) mesh[0][0], (long) mesh[0][1] );
|
|
if( mesh[1][2] == 0 )
|
|
surfaceEvaluator.evalcoord2f( (long) mesh[1][3], mesh[1][0], mesh[1][1] );
|
|
else
|
|
surfaceEvaluator.evalpoint2i( (long) mesh[1][0], (long) mesh[1][1] );
|
|
surfaceEvaluator.evalpoint2i( u, v );
|
|
surfaceEvaluator.endclosedline();
|
|
}
|
|
mesh[meshindex][0] = u;
|
|
mesh[meshindex][1] = v;
|
|
mesh[meshindex][2] = 1;
|
|
meshindex = (meshindex+1) % 2;
|
|
} else {
|
|
surfaceEvaluator.evalpoint2i( u, v );
|
|
}
|
|
#else
|
|
surfaceEvaluator.evalpoint2i( u, v );
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* swaptmesh - perform a swap of the triangle mesh pointers
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::swaptmesh( void )
|
|
{
|
|
#ifndef NOWIREFRAME
|
|
if( wireframetris ) {
|
|
meshindex = 1 - meshindex;
|
|
} else {
|
|
surfaceEvaluator.swaptmesh();
|
|
}
|
|
#else
|
|
surfaceEvaluator.swaptmesh();
|
|
#endif
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* endtmesh - postamble to triangle mesh
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::endtmesh( void )
|
|
{
|
|
#ifndef NOWIREFRAME
|
|
if( ! wireframetris )
|
|
surfaceEvaluator.endtmesh();
|
|
#else
|
|
surfaceEvaluator.endtmesh();
|
|
surfaceEvaluator.polymode( N_MESHFILL );
|
|
#endif
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* bgnoutline - preamble to outlined rendering
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::bgnoutline( void )
|
|
{
|
|
surfaceEvaluator.bgnline();
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* linevert - evaluate a point on an outlined contour
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::linevert( TrimVertex *t )
|
|
{
|
|
surfaceEvaluator.evalcoord2f( t->nuid, t->param[0], t->param[1] );
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* linevert - evaluate a grid point of an outlined contour
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::linevert( GridVertex *g )
|
|
{
|
|
surfaceEvaluator.evalpoint2i( g->gparam[0], g->gparam[1] );
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* endoutline - postamble to outlined rendering
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::endoutline( void )
|
|
{
|
|
surfaceEvaluator.endline();
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* triangle - output a triangle
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
void
|
|
Backend::triangle( TrimVertex *a, TrimVertex *b, TrimVertex *c )
|
|
{
|
|
bgntmesh( "spittriangle" );
|
|
tmeshvert( a );
|
|
tmeshvert( b );
|
|
tmeshvert( c );
|
|
endtmesh();
|
|
}
|
|
|
|
void
|
|
Backend::bgncurv( void )
|
|
{
|
|
curveEvaluator.bgnmap1f( 0 );
|
|
}
|
|
|
|
void
|
|
Backend::segment( REAL ulo, REAL uhi )
|
|
{
|
|
curveEvaluator.domain1f( ulo, uhi );
|
|
}
|
|
|
|
void
|
|
Backend::curvpts(
|
|
long type, /* geometry, color, texture, normal */
|
|
REAL *pts, /* control points */
|
|
long stride, /* distance to next point */
|
|
int order, /* parametric order */
|
|
REAL ulo, /* lower parametric bound */
|
|
REAL uhi ) /* upper parametric bound */
|
|
|
|
{
|
|
curveEvaluator.map1f( type, ulo, uhi, stride, order, pts );
|
|
curveEvaluator.enable( type );
|
|
}
|
|
|
|
void
|
|
Backend::curvgrid( REAL u0, REAL u1, long nu )
|
|
{
|
|
curveEvaluator.mapgrid1f( nu, u0, u1 );
|
|
}
|
|
|
|
void
|
|
Backend::curvmesh( long from, long n )
|
|
{
|
|
curveEvaluator.mapmesh1f( N_MESHFILL, from, from+n );
|
|
}
|
|
|
|
void
|
|
Backend::curvpt(REAL u)
|
|
{
|
|
curveEvaluator.evalcoord1f( 0, u );
|
|
}
|
|
|
|
void
|
|
Backend::bgnline( void )
|
|
{
|
|
curveEvaluator.bgnline();
|
|
}
|
|
|
|
void
|
|
Backend::endline( void )
|
|
{
|
|
curveEvaluator.endline();
|
|
}
|
|
|
|
void
|
|
Backend::endcurv( void )
|
|
{
|
|
curveEvaluator.endmap1f();
|
|
}
|