📄 coveandtiler.cc
字号:
/*** License Applicability. Except to the extent portions of this file are** made subject to an alternative license as permitted in the SGI Free** Software License B, Version 1.1 (the "License"), the contents of this** file are subject only to the provisions of the License. You may not use** this file except in compliance with the License. You may obtain a copy** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:**** http://oss.sgi.com/projects/FreeB**** Note that, as provided in the License, the Software is distributed on an** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.**** Original Code. The Original Code is: OpenGL Sample Implementation,** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.** Copyright in any portions created by third parties is as indicated** elsewhere herein. All Rights Reserved.**** Additional Notice Provisions: The application programming interfaces** established by SGI in conjunction with the Original Code are The** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X** Window System(R) (Version 1.3), released October 19, 1998. This software** was created using the OpenGL(R) version 1.2.1 Sample Implementation** published by SGI, but has not been independently verified as being** compliant with the OpenGL(R) version 1.2.1 Specification.*//* * coveandtiler.c++ * */#include "glimports.h"#include "myassert.h"#include "mystdio.h"#include "coveandtiler.h"#include "gridvertex.h"#include "gridtrimvertex.h"#include "uarray.h"#include "backend.h"const int CoveAndTiler::MAXSTRIPSIZE = 1000;CoveAndTiler::CoveAndTiler( Backend& b ) : backend( b ){ }CoveAndTiler::~CoveAndTiler( void ){ }inline voidCoveAndTiler::output( GridVertex &gv ){ backend.tmeshvert( &gv );}inline voidCoveAndTiler::output( TrimVertex *tv ){ backend.tmeshvert( tv );}inline voidCoveAndTiler::output( GridTrimVertex& g ){ backend.tmeshvert( &g );}voidCoveAndTiler::coveAndTile( void ){ long ustart = (top.ustart >= bot.ustart) ? top.ustart : bot.ustart; long uend = (top.uend <= bot.uend) ? top.uend : bot.uend; if( ustart <= uend ) { tile( bot.vindex, ustart, uend ); if( top.ustart >= bot.ustart ) coveUpperLeft(); else coveLowerLeft(); if( top.uend <= bot.uend ) coveUpperRight(); else coveLowerRight(); } else { TrimVertex blv, tlv, *bl, *tl; GridTrimVertex bllv, tllv; TrimVertex *lf = left.first(); TrimVertex *ll = left.last(); if( lf->param[0] >= ll->param[0] ) { blv.param[0] = lf->param[0]; blv.param[1] = ll->param[1]; blv.nuid = 0; // XXX assert( blv.param[1] == bot.vval ); bl = &blv; tl = lf; tllv.set( lf ); if( ll->param[0] > uarray.uarray[top.ustart-1] ) { bllv.set( ll ); assert( ll->param[0] <= uarray.uarray[bot.ustart] ); } else { bllv.set( top.ustart-1, bot.vindex ); } coveUpperLeftNoGrid( bl ); } else { tlv.param[0] = ll->param[0]; tlv.param[1] = lf->param[1]; tlv.nuid = 0; // XXX assert( tlv.param[1] == top.vval ); tl = &tlv; bl = ll; bllv.set( ll ); if( lf->param[0] > uarray.uarray[bot.ustart-1] ) { assert( lf->param[0] <= uarray.uarray[bot.ustart] ); tllv.set( lf ); } else { tllv.set( bot.ustart-1, top.vindex ); } coveLowerLeftNoGrid( tl ); } TrimVertex brv, trv, *br, *tr; GridTrimVertex brrv, trrv; TrimVertex *rf = right.first(); TrimVertex *rl = right.last(); if( rf->param[0] <= rl->param[0] ) { brv.param[0] = rf->param[0]; brv.param[1] = rl->param[1]; brv.nuid = 0; // XXX assert( brv.param[1] == bot.vval ); br = &brv; tr = rf; trrv.set( rf ); if( rl->param[0] < uarray.uarray[top.uend+1] ) { assert( rl->param[0] >= uarray.uarray[top.uend] ); brrv.set( rl ); } else { brrv.set( top.uend+1, bot.vindex ); } coveUpperRightNoGrid( br ); } else { trv.param[0] = rl->param[0]; trv.param[1] = rf->param[1]; trv.nuid = 0; // XXX assert( trv.param[1] == top.vval ); tr = &trv; br = rl; brrv.set( rl ); if( rf->param[0] < uarray.uarray[bot.uend+1] ) { assert( rf->param[0] >= uarray.uarray[bot.uend] ); trrv.set( rf ); } else { trrv.set( bot.uend+1, top.vindex ); } coveLowerRightNoGrid( tr ); } backend.bgntmesh( "doit" ); output(trrv); output(tllv); output( tr ); output( tl ); output( br ); output( bl ); output(brrv); output(bllv); backend.endtmesh(); }}voidCoveAndTiler::tile( long vindex, long ustart, long uend ){ long numsteps = uend - ustart; if( numsteps == 0 ) return; if( numsteps > MAXSTRIPSIZE ) { long umid = ustart + (uend - ustart) / 2; tile( vindex, ustart, umid ); tile( vindex, umid, uend ); } else { backend.surfmesh( ustart, vindex-1, numsteps, 1 ); }}voidCoveAndTiler::coveUpperRight( void ){ GridVertex tgv( top.uend, top.vindex ); GridVertex gv( top.uend, bot.vindex ); right.first(); backend.bgntmesh( "coveUpperRight" ); output( right.next() ); output( tgv ); backend.swaptmesh(); output( gv ); coveUR(); backend.endtmesh();}voidCoveAndTiler::coveUpperRightNoGrid( TrimVertex* br ){ backend.bgntmesh( "coveUpperRight" ); output( right.first() ); output( right.next() ); backend.swaptmesh(); output( br ); coveUR(); backend.endtmesh();}voidCoveAndTiler::coveUR( ){ GridVertex gv( top.uend, bot.vindex ); TrimVertex *vert = right.next(); if( vert == NULL ) return; assert( vert->param[0] >= uarray.uarray[gv.gparam[0]] ); if( gv.nextu() >= bot.uend ) { for( ; vert; vert = right.next() ) { output( vert ); backend.swaptmesh(); } } else while( 1 ) { if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) { output( vert ); backend.swaptmesh(); vert = right.next(); if( vert == NULL ) break; } else { backend.swaptmesh(); output( gv ); if( gv.nextu() == bot.uend ) { for( ; vert; vert = right.next() ) { output( vert ); backend.swaptmesh(); } break; } } }}voidCoveAndTiler::coveUpperLeft( void ){ GridVertex tgv( top.ustart, top.vindex ); GridVertex gv( top.ustart, bot.vindex ); left.first(); backend.bgntmesh( "coveUpperLeft" ); output( tgv ); output( left.next() ); output( gv ); backend.swaptmesh(); coveUL(); backend.endtmesh();}voidCoveAndTiler::coveUpperLeftNoGrid( TrimVertex* bl ){ backend.bgntmesh( "coveUpperLeftNoGrid" ); output( left.first() ); output( left.next() ); output( bl ); backend.swaptmesh(); coveUL(); backend.endtmesh();}voidCoveAndTiler::coveUL(){ GridVertex gv( top.ustart, bot.vindex ); TrimVertex *vert = left.next(); if( vert == NULL ) return; assert( vert->param[0] <= uarray.uarray[gv.gparam[0]] ); if( gv.prevu() <= bot.ustart ) { for( ; vert; vert = left.next() ) { backend.swaptmesh(); output( vert ); } } else while( 1 ) { if( vert->param[0] > uarray.uarray[gv.gparam[0]] ) { backend.swaptmesh(); output( vert ); vert = left.next(); if( vert == NULL ) break; } else { output( gv ); backend.swaptmesh(); if( gv.prevu() == bot.ustart ) { for( ; vert; vert = left.next() ) { backend.swaptmesh(); output( vert ); } break; } } }}voidCoveAndTiler::coveLowerLeft( void ){ GridVertex bgv( bot.ustart, bot.vindex ); GridVertex gv( bot.ustart, top.vindex ); left.last(); backend.bgntmesh( "coveLowerLeft" ); output( left.prev() ); output( bgv ); backend.swaptmesh(); output( gv ); coveLL(); backend.endtmesh();}voidCoveAndTiler::coveLowerLeftNoGrid( TrimVertex* tl ){ backend.bgntmesh( "coveLowerLeft" ); output( left.last() ); output( left.prev() ); backend.swaptmesh(); output( tl ); coveLL( ); backend.endtmesh();}voidCoveAndTiler::coveLL(){ GridVertex gv( bot.ustart, top.vindex ); TrimVertex *vert = left.prev(); if( vert == NULL ) return; assert( vert->param[0] <= uarray.uarray[gv.gparam[0]] ); if( gv.prevu() <= top.ustart ) { for( ; vert; vert = left.prev() ) { output( vert ); backend.swaptmesh(); } } else while( 1 ) { if( vert->param[0] > uarray.uarray[gv.gparam[0]] ){ output( vert ); backend.swaptmesh(); vert = left.prev(); if( vert == NULL ) break; } else { backend.swaptmesh(); output( gv ); if( gv.prevu() == top.ustart ) { for( ; vert; vert = left.prev() ) { output( vert ); backend.swaptmesh(); } break; } } }}voidCoveAndTiler::coveLowerRight( void ){ GridVertex bgv( bot.uend, bot.vindex ); GridVertex gv( bot.uend, top.vindex ); right.last(); backend.bgntmesh( "coveLowerRight" ); output( bgv ); output( right.prev() ); output( gv ); backend.swaptmesh(); coveLR(); backend.endtmesh( );}voidCoveAndTiler::coveLowerRightNoGrid( TrimVertex* tr ){ backend.bgntmesh( "coveLowerRIght" ); output( right.last() ); output( right.prev() ); output( tr ); backend.swaptmesh(); coveLR(); backend.endtmesh();}voidCoveAndTiler::coveLR( ){ GridVertex gv( bot.uend, top.vindex ); TrimVertex *vert = right.prev(); if( vert == NULL ) return; assert( vert->param[0] >= uarray.uarray[gv.gparam[0]] ); if( gv.nextu() >= top.uend ) { for( ; vert; vert = right.prev() ) { backend.swaptmesh(); output( vert ); } } else while( 1 ) { if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) { backend.swaptmesh(); output( vert ); vert = right.prev(); if( vert == NULL ) break; } else { output( gv ); backend.swaptmesh(); if( gv.nextu() == top.uend ) { for( ; vert; vert = right.prev() ) { backend.swaptmesh(); output( vert ); } break; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -