ReactOS 0.4.15-dev-7906-g1b85a5f
quilt.cc
Go to the documentation of this file.
1/*
2** License Applicability. Except to the extent portions of this file are
3** made subject to an alternative license as permitted in the SGI Free
4** Software License B, Version 1.1 (the "License"), the contents of this
5** file are subject only to the provisions of the License. You may not use
6** this file except in compliance with the License. You may obtain a copy
7** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9**
10** http://oss.sgi.com/projects/FreeB
11**
12** Note that, as provided in the License, the Software is distributed on an
13** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17**
18** Original Code. The Original Code is: OpenGL Sample Implementation,
19** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21** Copyright in any portions created by third parties is as indicated
22** elsewhere herein. All Rights Reserved.
23**
24** Additional Notice Provisions: The application programming interfaces
25** established by SGI in conjunction with the Original Code are The
26** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29** Window System(R) (Version 1.3), released October 19, 1998. This software
30** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31** published by SGI, but has not been independently verified as being
32** compliant with the OpenGL(R) version 1.2.1 Specification.
33*/
34
35/*
36 * quilt.c++
37 *
38 */
39
40//#include "glimports.h"
41//#include "mystdio.h"
42//#include "myassert.h"
43#include "quilt.h"
44#include "backend.h"
45#include "mapdesc.h"
46#include "flist.h"
47#include "patchlist.h"
48#include "simplemath.h" //min()
49
50/* local preprocessor definitions */
51#define DEF_PATCH_STEPSIZE .4
52#define fsizeof(x) (sizeof(x)/sizeof(REAL))
53
54
56{
57 mapdesc = _mapdesc;
58}
59
60void
62{
63 for( Quiltspec *q=qspec; q != eqspec; q++ ) {
64#if 1
65 if( q->breakpoints) delete[] q->breakpoints;
66 q->breakpoints = 0;
67#else
68 if( q->breakpoints) {
69 delete[] q->breakpoints;
70 q->breakpoints = 0;
71printf("in here\n");
72 }
73#endif
74 }
75 if( cpts ) delete[] cpts;
76 cpts = 0;
78}
79
80void
82{
83#ifndef NDEBUG
84 int nc = mapdesc->getNcoords();
85 REAL *ps = cpts;
86 ps += qspec[0].offset;
87 ps += qspec[1].offset;
88 for( int i=0; i!= qspec[0].order * qspec[0].width; i++ ) {
89 for( int j = 0; j!= qspec[1].order * qspec[1].width; j++ ) {
90 for( int k=0; k < nc; k++ )
91 _glu_dprintf( "%g ", ps[i*qspec[0].stride + j*qspec[1].stride + k] );
92 _glu_dprintf( "\n" );
93 }
94 _glu_dprintf( "\n" );
95 }
96 _glu_dprintf( "\n" );
97#endif
98}
99
100/*--------------------------------------------------------------------------
101 * Quilt::select - find which map in each quilt contains the points
102 * pta and ptb with pta[i] < ptb[i]
103 *--------------------------------------------------------------------------
104 */
105
106void
108{
109 int dim = eqspec - qspec;
110 int i, j;
111 for( i=0; i<dim; i++) {
112 for( j=qspec[i].width-1; j>=0; j-- )
113 if( (qspec[i].breakpoints[j] <= pta[i] ) &&
114 (ptb[i] <= qspec[i].breakpoints[j+1] ) )
115 break;
116 assert( j != -1 );
117 qspec[i].index = j;
118 }
119}
120
121void
123{
124 if( getDimension() == 2 ) {
125 REAL *ps = cpts;
126 ps += qspec[0].offset;
127 ps += qspec[1].offset;
128 ps += qspec[0].index * qspec[0].order * qspec[0].stride;
129 ps += qspec[1].index * qspec[1].order * qspec[1].stride;
130 backend.surfpts( mapdesc->getType(), ps,
131 qspec[0].stride,
132 qspec[1].stride,
133 qspec[0].order,
134 qspec[1].order,
136 qspec[0].breakpoints[qspec[0].index+1],
138 qspec[1].breakpoints[qspec[1].index+1] );
139 } else {
140 REAL *ps = cpts;
141 ps += qspec[0].offset;
142 ps += qspec[0].index * qspec[0].order * qspec[0].stride;
143 backend.curvpts( mapdesc->getType(), ps,
144 qspec[0].stride,
145 qspec[0].order,
147 qspec[0].breakpoints[qspec[0].index+1] );
148 }
149}
150
151/*--------------------------------------------------------------------------
152 * Quilt::downloadAll - download each map that contains the current patch
153 *--------------------------------------------------------------------------
154 */
155
156void
157Quilt::downloadAll( REAL *pta, REAL *ptb, Backend &backend )
158{
159 for( Quilt *m = this; m; m=m->next ) {
160 m->select( pta, ptb );
161 m->download( backend );
162 }
163}
164
165/*--------------------------------------------------------------------------
166 * Quilt::isCulled - determine if an entire quilt is trivially rejected.
167 *--------------------------------------------------------------------------
168 */
169
170int
172{
173 if( mapdesc->isCulling() )
175 qspec[0].order * qspec[0].width, qspec[0].stride,
176 qspec[1].order * qspec[1].width, qspec[1].stride );
177 else
178 return CULL_ACCEPT;
179}
180
181/*---------------------------------------------------------------------------
182 * Quilt::getRange - retrieve the valid paramater range of a set of quilts
183 *---------------------------------------------------------------------------
184 */
185void
187{
188 getRange( from, to, 0, slist );
189 getRange( from, to, 1, tlist );
190}
191
192/*---------------------------------------------------------------------------
193 * Quilt::getRange - retrieve the valid paramater range of a set of quilts
194 *---------------------------------------------------------------------------
195 */
196void
198{
199 Quilt *maps = this;
200 from[i] = maps->qspec[i].breakpoints[0];
201 to[i] = maps->qspec[i].breakpoints[maps->qspec[i].width];
202 int maxpts = 0;
203 Quilt_ptr m;
204 for( m=maps; m; m=m->next ) {
205 if( m->qspec[i].breakpoints[0] > from[i] )
206 from[i] = m->qspec[i].breakpoints[0];
207 if( m->qspec[i].breakpoints[m->qspec[i].width] < to[i] )
208 to[i] = m->qspec[i].breakpoints[m->qspec[i].width];
209 maxpts += m->qspec[i].width + 1;
210 }
211
212 list.grow( maxpts );
213
214 for( m=maps; m; m=m->next )
215 for( int j=0; j<=m->qspec[i].width; j++ ) {
216 list.add( m->qspec[i].breakpoints[j] );
217 }
218
219 list.filter( );
220 list.taper( from[i], to[i] );
221}
222
223void
225{
226 getRange( from, to, 0, slist );
227}
228
229void
231{
232 findSampleRates( slist, tlist );
233 rate[0] = qspec[0].step_size;
234 rate[1] = qspec[1].step_size;
235
236 for( Quilt *q = next; q; q = q->next ) {
237 q->findSampleRates( slist, tlist );
238 if( q->qspec[0].step_size < rate[0] )
239 rate[0] = q->qspec[0].step_size;
240 if( q->qspec[1].step_size < rate[1] )
241 rate[1] = q->qspec[1].step_size;
242 }
243}
244
245void
247{
249 (qspec[0].breakpoints[qspec[0].width] - qspec[0].breakpoints[0]);
251 (qspec[1].breakpoints[qspec[1].width] - qspec[1].breakpoints[0]);
252
253 for( int i = slist.start; i < slist.end-1; i++ ) {
254 for( int j = tlist.start; j < tlist.end-1; j++ ) {
255
256 REAL pta[2], ptb[2];
257 pta[0] = slist.pts[i];
258 ptb[0] = slist.pts[i+1];
259 pta[1] = tlist.pts[j];
260 ptb[1] = tlist.pts[j+1];
261 Patchlist patchlist( this, pta, ptb );
262 patchlist.getstepsize();
263
264 {
265 float edge_len_s = min(glu_abs(ptb[0]-pta[0]),1.0);
266 float edge_len_t = min(glu_abs(ptb[1]-pta[1]),1.0);
267
268 if( patchlist.getStepsize(0)/edge_len_s < qspec[0].step_size )
269 qspec[0].step_size = patchlist.getStepsize(0)/edge_len_s;
270 if( patchlist.getStepsize(1)/edge_len_t < qspec[1].step_size )
271 qspec[1].step_size = patchlist.getStepsize(1)/edge_len_t;
272 }
273 }
274 }
275}
void curvpts(long, REAL *, long, int, REAL, REAL)
Definition: backend.cc:541
void surfpts(long, REAL *, long, long, int, int, REAL, REAL, REAL, REAL)
Definition: backend.cc:105
Definition: flist.h:42
REAL * pts
Definition: flist.h:44
int start
Definition: flist.h:46
int end
Definition: flist.h:47
int isCulling(void)
Definition: mapdesc.h:261
long getType(void)
Definition: mapdesc.h:168
int getNcoords(void)
Definition: mapdesc.h:198
int xformAndCullCheck(REAL *, int, int, int, int)
Definition: mapdesc.cc:355
void getstepsize(void)
Definition: patchlist.cc:114
REAL getStepsize(int)
Definition: patchlist.h:70
Definition: bufpool.h:50
void deleteMe(Pool &)
Definition: bufpool.h:136
Definition: quilt.h:64
REAL * cpts
Definition: quilt.h:68
void show()
Definition: quilt.cc:81
Quilt * next
Definition: quilt.h:71
Mapdesc * mapdesc
Definition: quilt.h:67
void select(REAL *, REAL *)
Definition: quilt.cc:107
void deleteMe(Pool &)
Definition: quilt.cc:61
int isCulled(void)
Definition: quilt.cc:171
Quilt(Mapdesc *)
Definition: quilt.cc:55
int getDimension(void)
Definition: quilt.h:78
void findRates(Flist &slist, Flist &tlist, REAL[2])
Definition: quilt.cc:230
void downloadAll(REAL *, REAL *, Backend &)
Definition: quilt.cc:157
void download(Backend &)
Definition: quilt.cc:122
void getRange(REAL *, REAL *, Flist &, Flist &)
Definition: quilt.cc:186
Quiltspec qspec[MAXDIM]
Definition: quilt.h:69
void findSampleRates(Flist &slist, Flist &tlist)
Definition: quilt.cc:246
Quiltspec_ptr eqspec
Definition: quilt.h:70
Definition: list.h:37
Definition: _slist.h:57
iterator end()
Definition: _slist.h:420
#define CULL_ACCEPT
Definition: defines.h:42
float REAL
Definition: types.h:41
#define assert(x)
Definition: debug.h:53
#define printf
Definition: freeldr.h:93
GLint GLint GLsizei width
Definition: gl.h:1546
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLsizei stride
Definition: glext.h:5848
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
GLintptr offset
Definition: glext.h:5920
const GLfloat * m
Definition: glext.h:10848
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define min(a, b)
Definition: monoChain.cc:55
int k
Definition: mpi.c:3369
int rate
Definition: pcmconverter.c:97
#define DEF_PATCH_STEPSIZE
Definition: quilt.cc:51
class Quilt * Quilt_ptr
Definition: quilt.h:90
REAL glu_abs(REAL x)
Definition: simplemath.h:50
CardRegion * from
Definition: spigame.cpp:19
Knot * breakpoints
Definition: quilt.h:59
int index
Definition: quilt.h:56
REAL step_size
Definition: quilt.h:58
int order
Definition: quilt.h:55
int stride
Definition: quilt.h:52
int offset
Definition: quilt.h:54
int width
Definition: quilt.h:53