ReactOS 0.4.15-dev-7934-g1dc8d80
backend.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 * backend.c++
37 *
38 */
39
40/* Bezier surface backend
41 - interprets display mode (wireframe,shaded,...)
42*/
43//#include <stdio.h>
44//#include "glimports.h"
45//#include "mystdio.h"
46#include "backend.h"
47#include "basiccrveval.h"
48#include "basicsurfeval.h"
49
50#define NOWIREFRAME
51
52
53/*-------------------------------------------------------------------------
54 * bgnsurf - preamble to surface definition and evaluations
55 *-------------------------------------------------------------------------
56 */
57void
58Backend::bgnsurf( int wiretris, int wirequads, long nuid )
59{
60/*#ifndef NOWIREFRAME*/ //need this for old version
61 wireframetris = wiretris;
62 wireframequads = wirequads;
63/*#endif*/
64
65 /*in the spec, GLU_DISPLAY_MODE is either
66 * GLU_FILL
67 * GLU_OUTLINE_POLY
68 * GLU_OUTLINE_PATCH.
69 *In fact, GLU_FLL is has the same effect as
70 * set GL_FRONT_AND_BACK to be GL_FILL
71 * and GLU_OUTLINE_POLY is the same as set
72 * GL_FRONT_AND_BACK to be GL_LINE
73 *It is more efficient to do this once at the beginning of
74 *each surface than to do it for each primitive.
75 * The internal has more options: outline_triangle and outline_quad
76 *can be seperated. But since this is not in spec, and more importantly,
77 *this is not so useful, so we don't need to keep this option.
78 */
79
81
82 if(wiretris)
84 else
86}
87
88void
89Backend::patch( REAL ulo, REAL uhi, REAL vlo, REAL vhi )
90{
91 surfaceEvaluator.domain2f( ulo, uhi, vlo, vhi );
92}
93
94void
96{
98}
99
100/*-------------------------------------------------------------------------
101 * surfpts - pass a desription of a surface map
102 *-------------------------------------------------------------------------
103 */
104void
106 long type, /* geometry, color, texture, normal */
107 REAL *pts, /* control points */
108 long ustride, /* distance to next point in u direction */
109 long vstride, /* distance to next point in v direction */
110 int uorder, /* u parametric order */
111 int vorder, /* v parametric order */
112 REAL ulo, /* u lower bound */
113 REAL uhi, /* u upper bound */
114 REAL vlo, /* v lower bound */
115 REAL vhi ) /* v upper bound */
116{
117 surfaceEvaluator.map2f( type,ulo,uhi,ustride,uorder,vlo,vhi,vstride,vorder,pts );
119}
120
121/*-------------------------------------------------------------------------
122 * surfgrid - define a lattice of points with origin and offset
123 *-------------------------------------------------------------------------
124 */
125void
126Backend::surfgrid( REAL u0, REAL u1, long nu, REAL v0, REAL v1, long nv )
127{
128 surfaceEvaluator.mapgrid2f( nu, u0, u1, nv, v0, v1 );
129}
130
131/*-------------------------------------------------------------------------
132 * surfmesh - evaluate a mesh of points on lattice
133 *-------------------------------------------------------------------------
134 */
135void
136Backend::surfmesh( long u, long v, long n, long m )
137{
138#ifndef NOWIREFRAME
139 if( wireframequads ) {
140 long v0, v1;
141 long u0f = u, u1f = u+n;
142 long v0f = v, v1f = v+m;
143 long parity = (u & 1);
144
145 for( v0 = v0f, v1 = v0f++ ; v0<v1f; v0 = v1, v1++ ) {
147 for( long u = u0f; u<=u1f; u++ ) {
148 if( parity ) {
151 } else {
154 }
155 parity = 1 - parity;
156 }
158 }
159 } else {
161 }
162#else
163 if( wireframequads ) {
164
166 } else {
167
169 }
170#endif
171}
172
173/*-------------------------------------------------------------------------
174 * endsurf - postamble to surface
175 *-------------------------------------------------------------------------
176 */
177void
179{
181}
182
183/***************************************/
184void
186{
188/*
189 if(wireframetris)
190 surfaceEvaluator.polymode( N_MESHLINE );
191 else
192 surfaceEvaluator.polymode( N_MESHFILL );
193*/
194}
195
196void
198{
200}
201
202void
204{
206/*
207 if(wireframequads)
208 surfaceEvaluator.polymode( N_MESHLINE );
209 else
210 surfaceEvaluator.polymode( N_MESHFILL );
211*/
212}
213
214void
216{
218}
219
220void
221Backend::evalUStrip(int n_upper, REAL v_upper, REAL* upper_val,
222 int n_lower, REAL v_lower, REAL* lower_val
223 )
224{
225 surfaceEvaluator.evalUStrip(n_upper, v_upper, upper_val,
226 n_lower, v_lower, lower_val);
227}
228
229void
230Backend::evalVStrip(int n_left, REAL u_left, REAL* left_val,
231 int n_right, REAL u_right, REAL* right_val
232 )
233{
234 surfaceEvaluator.evalVStrip(n_left, u_left, left_val,
235 n_right, u_right, right_val);
236}
237
238/***************************************/
239
240
241/*-------------------------------------------------------------------------
242 * bgntmesh - preamble to a triangle mesh
243 *-------------------------------------------------------------------------
244 */
245void
246Backend::bgntmesh( const char * )
247{
248#ifndef NOWIREFRAME
249
250 meshindex = 0; /* I think these need to be initialized to zero */
251 npts = 0;
252
253 if( !wireframetris ) {
255 }
256#else
257
258 if( wireframetris ) {
261 } else {
264 }
265#endif
266}
267
268void
270{
271 if( v->isGridVert() ) {
272 tmeshvert( v->g );
273 } else {
274 tmeshvert( v->t );
275 }
276}
277
278void
280{
281// surfaceEvaluator.inDoEvalCoord2NOGE( t->param[0], t->param[1], temp, ttt);
282#ifdef USE_OPTTT
283 surfaceEvaluator.inDoEvalCoord2NOGE( t->param[0], t->param[1], t->cache_point, t->cache_normal);
284#endif
285}
286
287//opt for a line with the same u.
288void
290{
291#ifdef USE_OPTTT
292 surfaceEvaluator.inDoEvalCoord2NOGE_BU( t->param[0], t->param[1], t->cache_point, t->cache_normal);
293#endif
294}
295
296//opt for a line with the same v.
297void
299{
300#ifdef USE_OPTTT
301 surfaceEvaluator.inDoEvalCoord2NOGE_BV( t->param[0], t->param[1], t->cache_point, t->cache_normal);
302#endif
303}
304
305void
307{
309}
310
311void
313{
315}
316
317
318/*-------------------------------------------------------------------------
319 * tmeshvert - evaluate a point on a triangle mesh
320 *-------------------------------------------------------------------------
321 */
322void
324{
325
326#ifndef NOWIREFRAME
327 const long nuid = t->nuid;
328#endif
329 const REAL u = t->param[0];
330 const REAL v = t->param[1];
331
332#ifndef NOWIREFRAME
333 npts++;
334 if( wireframetris ) {
335 if( npts >= 3 ) {
337 if( mesh[0][2] == 0 )
338 surfaceEvaluator.evalcoord2f( mesh[0][3], mesh[0][0], mesh[0][1] );
339 else
340 surfaceEvaluator.evalpoint2i( (long) mesh[0][0], (long) mesh[0][1] );
341 if( mesh[1][2] == 0 )
342 surfaceEvaluator.evalcoord2f( mesh[1][3], mesh[1][0], mesh[1][1] );
343 else
344 surfaceEvaluator.evalpoint2i( (long) mesh[1][0], (long) mesh[1][1] );
347 }
348 mesh[meshindex][0] = u;
349 mesh[meshindex][1] = v;
350 mesh[meshindex][2] = 0;
351 mesh[meshindex][3] = nuid;
352 meshindex = (meshindex+1) % 2;
353 } else {
355 }
356#else
357
359//for uninitial memory read surfaceEvaluator.evalcoord2f( nuid, u, v );
360#endif
361}
362
363//the same as tmeshvert(trimvertex), for efficiency purpose
364void
366{
367#ifndef NOWIREFRAME
368 const long nuid = 0;
369
370 npts++;
371 if( wireframetris ) {
372 if( npts >= 3 ) {
374 if( mesh[0][2] == 0 )
375 surfaceEvaluator.evalcoord2f( mesh[0][3], mesh[0][0], mesh[0][1] );
376 else
377 surfaceEvaluator.evalpoint2i( (long) mesh[0][0], (long) mesh[0][1] );
378 if( mesh[1][2] == 0 )
379 surfaceEvaluator.evalcoord2f( mesh[1][3], mesh[1][0], mesh[1][1] );
380 else
381 surfaceEvaluator.evalpoint2i( (long) mesh[1][0], (long) mesh[1][1] );
384 }
385 mesh[meshindex][0] = u;
386 mesh[meshindex][1] = v;
387 mesh[meshindex][2] = 0;
388 mesh[meshindex][3] = nuid;
389 meshindex = (meshindex+1) % 2;
390 } else {
392 }
393#else
394
396#endif
397}
398
399/*-------------------------------------------------------------------------
400 * tmeshvert - evaluate a grid point of a triangle mesh
401 *-------------------------------------------------------------------------
402 */
403void
405{
406 const long u = g->gparam[0];
407 const long v = g->gparam[1];
408
409#ifndef NOWIREFRAME
410 npts++;
411 if( wireframetris ) {
412 if( npts >= 3 ) {
414 if( mesh[0][2] == 0 )
415 surfaceEvaluator.evalcoord2f( (long) mesh[0][3], mesh[0][0], mesh[0][1] );
416 else
417 surfaceEvaluator.evalpoint2i( (long) mesh[0][0], (long) mesh[0][1] );
418 if( mesh[1][2] == 0 )
419 surfaceEvaluator.evalcoord2f( (long) mesh[1][3], mesh[1][0], mesh[1][1] );
420 else
421 surfaceEvaluator.evalpoint2i( (long) mesh[1][0], (long) mesh[1][1] );
424 }
425 mesh[meshindex][0] = u;
426 mesh[meshindex][1] = v;
427 mesh[meshindex][2] = 1;
428 meshindex = (meshindex+1) % 2;
429 } else {
431 }
432#else
434#endif
435}
436
437/*-------------------------------------------------------------------------
438 * swaptmesh - perform a swap of the triangle mesh pointers
439 *-------------------------------------------------------------------------
440 */
441void
443{
444#ifndef NOWIREFRAME
445 if( wireframetris ) {
446 meshindex = 1 - meshindex;
447 } else {
449 }
450#else
452#endif
453}
454
455/*-------------------------------------------------------------------------
456 * endtmesh - postamble to triangle mesh
457 *-------------------------------------------------------------------------
458 */
459void
461{
462#ifndef NOWIREFRAME
463 if( ! wireframetris )
465#else
467/* surfaceEvaluator.polymode( N_MESHFILL );*/
468#endif
469}
470
471
472/*-------------------------------------------------------------------------
473 * bgnoutline - preamble to outlined rendering
474 *-------------------------------------------------------------------------
475 */
476void
478{
480}
481
482/*-------------------------------------------------------------------------
483 * linevert - evaluate a point on an outlined contour
484 *-------------------------------------------------------------------------
485 */
486void
488{
489 surfaceEvaluator.evalcoord2f( t->nuid, t->param[0], t->param[1] );
490}
491
492/*-------------------------------------------------------------------------
493 * linevert - evaluate a grid point of an outlined contour
494 *-------------------------------------------------------------------------
495 */
496void
498{
499 surfaceEvaluator.evalpoint2i( g->gparam[0], g->gparam[1] );
500}
501
502/*-------------------------------------------------------------------------
503 * endoutline - postamble to outlined rendering
504 *-------------------------------------------------------------------------
505 */
506void
508{
510}
511
512/*-------------------------------------------------------------------------
513 * triangle - output a triangle
514 *-------------------------------------------------------------------------
515 */
516void
518{
519/* bgntmesh( "spittriangle" );*/
520 bgntfan();
521 tmeshvert( a );
522 tmeshvert( b );
523 tmeshvert( c );
524 endtfan();
525/* endtmesh();*/
526}
527
528void
530{
532}
533
534void
536{
537 curveEvaluator.domain1f( ulo, uhi );
538}
539
540void
542 long type, /* geometry, color, texture, normal */
543 REAL *pts, /* control points */
544 long stride, /* distance to next point */
545 int order, /* parametric order */
546 REAL ulo, /* lower parametric bound */
547 REAL uhi ) /* upper parametric bound */
548
549{
550 curveEvaluator.map1f( type, ulo, uhi, stride, order, pts );
552}
553
554void
556{
557 curveEvaluator.mapgrid1f( nu, u0, u1 );
558}
559
560void
562{
564}
565
566void
568{
570}
571
572void
574{
576}
577
578void
580{
582}
583
584void
586{
588}
void endcurv(void)
Definition: backend.cc:585
void linevert(TrimVertex *)
Definition: backend.cc:487
void tmeshvertNOGE_BV(TrimVertex *t)
Definition: backend.cc:298
void bgnsurf(int, int, long)
Definition: backend.cc:58
void evalUStrip(int n_upper, REAL v_upper, REAL *upper_val, int n_lower, REAL v_lower, REAL *lower_val)
Definition: backend.cc:221
void curvmesh(long, long)
Definition: backend.cc:561
int wireframetris
Definition: backend.h:105
void swaptmesh(void)
Definition: backend.cc:442
void bgnqstrip()
Definition: backend.cc:203
void tmeshvert(GridTrimVertex *)
Definition: backend.cc:269
void bgnoutline(void)
Definition: backend.cc:477
void bgntfan()
Definition: backend.cc:185
void curvgrid(REAL, REAL, long)
Definition: backend.cc:555
void endsurf(void)
Definition: backend.cc:178
void curvpts(long, REAL *, long, int, REAL, REAL)
Definition: backend.cc:541
void tmeshvertNOGE_BU(TrimVertex *t)
Definition: backend.cc:289
void surfmesh(long, long, long, long)
Definition: backend.cc:136
void patch(REAL, REAL, REAL, REAL)
Definition: backend.cc:89
void endtfan()
Definition: backend.cc:197
void evalVStrip(int n_left, REAL u_left, REAL *left_val, int n_right, REAL v_right, REAL *right_val)
Definition: backend.cc:230
void surfpts(long, REAL *, long, long, int, int, REAL, REAL, REAL, REAL)
Definition: backend.cc:105
void endtmesh(void)
Definition: backend.cc:460
void endqstrip()
Definition: backend.cc:215
int wireframequads
Definition: backend.h:106
void bgntmesh(const char *)
Definition: backend.cc:246
void tmeshvertNOGE(TrimVertex *t)
Definition: backend.cc:279
BasicCurveEvaluator & curveEvaluator
Definition: backend.h:48
void endline(void)
Definition: backend.cc:579
void curvpt(REAL)
Definition: backend.cc:567
void preEvaluateBU(REAL u)
Definition: backend.cc:306
BasicSurfaceEvaluator & surfaceEvaluator
Definition: backend.h:49
void preEvaluateBV(REAL v)
Definition: backend.cc:312
void bgnline(void)
Definition: backend.cc:573
void surfbbox(long, REAL *, REAL *)
Definition: backend.cc:95
int npts
Definition: backend.h:107
void surfgrid(REAL, REAL, long, REAL, REAL, long)
Definition: backend.cc:126
void segment(REAL, REAL)
Definition: backend.cc:535
void bgncurv(void)
Definition: backend.cc:529
void triangle(TrimVertex *, TrimVertex *, TrimVertex *)
Definition: backend.cc:517
void endoutline(void)
Definition: backend.cc:507
int meshindex
Definition: backend.h:109
virtual void endmap1f(void)
virtual void bgnmap1f(long)
Definition: basiccrveval.cc:77
virtual void enable(long)
Definition: basiccrveval.cc:61
virtual void mapgrid1f(long, REAL, REAL)
Definition: basiccrveval.cc:93
virtual void evalcoord1f(long, REAL)
virtual void map1f(long, REAL, REAL, long, long, REAL *)
Definition: basiccrveval.cc:85
virtual void mapmesh1f(long, long, long)
virtual void domain1f(REAL, REAL)
Definition: basiccrveval.cc:45
virtual void endline(void)
virtual void bgnline(void)
virtual void endline(void)
virtual void bgnmap2f(long)
virtual void inPreEvaluateBU_intfac(REAL u)=0
virtual void inPreEvaluateBV_intfac(REAL v)=0
virtual void endmap2f(void)
virtual void map2f(long, REAL, REAL, long, long, REAL, REAL, long, long, REAL *)
virtual void bgnline(void)
virtual void bgntfan(void)
virtual void mapmesh2f(long, long, long, long, long)
virtual void inDoEvalCoord2NOGE(REAL u, REAL v, REAL *ret_point, REAL *ret_normal)=0
virtual void inDoEvalCoord2NOGE_BV(REAL u, REAL v, REAL *ret_point, REAL *ret_normal)=0
virtual void endclosedline(void)
virtual void polymode(long)
virtual void range2f(long, REAL *, REAL *)
virtual void inDoEvalCoord2NOGE_BU(REAL u, REAL v, REAL *ret_point, REAL *ret_normal)=0
virtual void bgntmesh(void)
virtual void evalUStrip(int n_upper, REAL v_upper, REAL *upper_val, int n_lower, REAL v_lower, REAL *lower_val)=0
virtual void mapgrid2f(long, REAL, REAL, long, REAL, REAL)
virtual void domain2f(REAL, REAL, REAL, REAL)
virtual void evalVStrip(int n_left, REAL u_left, REAL *left_val, int n_right, REAL u_right, REAL *right_val)=0
virtual void endqstrip(void)
virtual void swaptmesh(void)
virtual void evalcoord2f(long, REAL, REAL)
virtual void evalpoint2i(long, long)
virtual void endtmesh(void)
virtual void endtfan(void)
virtual void enable(long)
virtual void bgnclosedline(void)
virtual void bgnqstrip(void)
#define N_MESHFILL
Definition: displaymode.h:36
#define N_MESHLINE
Definition: displaymode.h:37
float REAL
Definition: types.h:41
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble GLdouble t
Definition: gl.h:2047
GLdouble n
Definition: glext.h:7729
GLdouble GLdouble GLint ustride
Definition: glext.h:8308
GLsizei stride
Definition: glext.h:5848
const GLubyte * c
Definition: glext.h:8905
GLdouble GLdouble GLint GLint uorder
Definition: glext.h:8308
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean g
Definition: glext.h:6204
GLfloat v0
Definition: glext.h:6061
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint vorder
Definition: glext.h:8308
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLfloat GLfloat v1
Definition: glext.h:6062
GLdouble u1
Definition: glext.h:8308
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint vstride
Definition: glext.h:8308
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 * u
Definition: glfuncs.h:240
CardRegion * from
Definition: spigame.cpp:19
Definition: mesh.c:198