blob: 1b9d7081aec6b253a7be43aa70a008a1bad874d8 [file] [log] [blame]
XXX - Not complete yet!!!
Name
SGIX_nurbs_eval
Name Strings
GL_SGIX_nurbs_eval
Version
$Date: 1998/02/12 18:24:45 $ $Revision: 1.6 $
Number
XXX
Dependencies
None
Overview
This extension adds a new evaluators type, NURBS. NURBS are a compact
representation of the datasets that many CAD and entertainment industry
customers are already using. The creation of a new interface allows for
levels of performance not achievable with the current evaluators API.
The current evaluators interface supports only Bezier curves, which suffer
from several disadvantages: Beziers are a wasteful of memory and graphics
interface bandwidth; Beziers representations are often larger than
the representations of the tesselated surfaces they are used to render;
Beziers are not a native format used by CAD and entertainment applications.
In the new NURBS extension, every effort has been made to extend the
existing evaluators interface, rather than define a completely new set of
interfaces and state.
Issues
* Should it be NURB or NURBS?
I'm choosing NURBS since it matches the GLU spec and glu extensions.
This does not agree with Farin's usage in the literature, but does agree
with many other authors.
New Procedures and Functions
void NurbsKnots1SGIX[fd]( enum target,
int uknotcount, T *uknots );
void NurbsKnots2SGIX[fd]( enum target,
int uknotcount, int vknotcount,
T *uknots, T *vknots );
New Tokens
Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and
by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
GetDoublev:
MAP1_VERTEX_3_NURBS_SGIX 0x81CB
MAP1_VERTEX_4_NURBS_SGIX 0x81CC
MAP1_INDEX_NURBS_SGIX 0x81CD
MAP1_COLOR_4_NURBS_SGIX 0x81CE
MAP1_NORMAL_NURBS_SGIX 0x81CF
MAP1_TEXTURE_COORD_1_NURBS_SGIX 0x81E0
MAP1_TEXTURE_COORD_2_NURBS_SGIX 0x81E1
MAP1_TEXTURE_COORD_3_NURBS_SGIX 0x81E2
MAP1_TEXTURE_COORD_4_NURBS_SGIX 0x81E3
MAP2_VERTEX_3_NURBS_SGIX 0x81E4
MAP2_VERTEX_4_NURBS_SGIX 0x81E5
MAP2_INDEX_NURBS_SGIX 0x81E6
MAP2_COLOR_4_NURBS_SGIX 0x81E7
MAP2_NORMAL_NURBS_SGIX 0x81E8
MAP2_TEXTURE_COORD_1_NURBS_SGIX 0x81E9
MAP2_TEXTURE_COORD_2_NURBS_SGIX 0x81EA
MAP2_TEXTURE_COORD_3_NURBS_SGIX 0x81EB
MAP2_TEXTURE_COORD_4_NURBS_SGIX 0x81EC
Accepted by the <value> parameter of GetMap[ifd]v:
NURBS_KNOT_COUNT_SGIX 0x81ED
NURBS_KNOT_VECTOR_SGIX 0x81EE
Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.0 Specification (Rasterization)
None
Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)
None
Additions to Chapter 5 of the 1.0 Specification (Special Functions)
Evaluators are extended to support both the existing specification, which
is a Bezier formulation, and a new NURBS formulation. New enable tokens
are used to enable NURBS evaluation when it is desired.
Basis Functions:
NURBS polynomials for curves are defined as follows:
Consider the R^k-valued polynomial q(u) is defined by
q(u) = sum(i=0,n) N_i^d(u) * R_i
with N_i^d(u) = N_i^(d-1)(u) * (u-u(i-1))/(u(i+d-1)-u(i-1)) +
N(i+1)^(d-1)(u) * (u(i+d)-u)/(u(i+d)-u_i)
the i_th NURBS basis polynomial of degree d.
Each R_i is a control point, and each u_i is a knot-value.
The complete set of {u_i} values is called the knot vector.
Map1[fd]:
When NURBS evaluation is enabled, the <order> parameter to the Map1[fd]
function is not really the mathematical order of the NURBS polynomial.
Instead, the <order> parameter merely determines the size of the array
given as input to Map1[fd] or Map2[fd]. In other words, the <order>
parameter only determines the size of the valid GL state for the map
array; it does not really capture the mathematical order of the curve or
surface.
Note that it is still true that the <order> parameter to Map1[fd] is equal
to n+1 in the equation defining NURBS polynomials at the beginning of this
section.
Map2[fd]:
NURBS polynomials for surfaces are defined as bivariate polynomials using
the same N_i^d basis functions as NURBS curves:
q(u,v) = sum(i=0,n) sum(j=0,m) N_i^d(u) * N_j^c(v) * R_ij
NurbsKnots1SGIX:
NurbsKnots2SGIX:
The <target> parameter must be one of GL_MAP1_VERTEX_3, GL_MAP1_VERTEX_4,
GL_MAP1_COLOR_4, GL_MAP1_INDEX, GL_MAP1_NORMAL, GL_MAP1_TEXTURE_COORD_1,
GL_MAP1_TEXTURE_COORD_2, GL_MAP1_TEXTURE_COORD_3, GL_MAP1_TEXTURE_COORD_4,
GL_MAP2_VERTEX_3, GL_MAP2_VERTEX_4, GL_MAP2_COLOR_4, GL_MAP2_INDEX,
GL_MAP2_NORMAL, GL_MAP2_TEXTURE_COORD_1, GL_MAP2_TEXTURE_COORD_2,
GL_MAP2_TEXTURE_COORD_3, or GL_MAP2_TEXTURE_COORD_4.
The knots vectors are defined by the new functions NurbsKnots1SGIX and
NurbsKnots2SGIX. The size of the knot vectors, <uknotcount> and
<vknotcount> implicitly define the degree of the NURBS curves or surfaces
defined. For curves, the degree is defined as:
d = <uknotcount> - <uorder> + 1
For surfaces, the second degree is defined as:
c = <vknotcount> - <vorder> + 1
The entries from the <uknots> and <vknots> input arrays are immediately
copied by the GL by the completion of this procedure.
EvalCoord[12][fd]:
EvalCoord[12][fd]v:
EvalPoint[12]:
EvalMesh[12]:
For all of the new MAP1_XXX_NURBS tokens, when MAP1_XXX_NURBS is disabled,
the evaluation functions, EvalCoord1[fd], EvalCoord1[fd]v, EvalPoint1, and
EvalMesh1 all evaluate Bezier curves for the given map as usual. When
MAP1_XXX_NURBS is enabled, the evaluation functions instead evaluate NURBS
curves. Similarly, the new MAP2_XXX_NURBS tokens are used to enable NURBS
surface evaluation for the functions EvalCoord2[fd], EvalCoord2[fd]v,
EvalPoint2, and EvalMesh2.
Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
None
Additions to the GLX Specification
None
GLX Protocol
XXX - Not figured out yet.
Dependencies on other extensions
None
Errors
INVALID_VALUE is generated if NurbsKnots[12]SGIX parameter <uknotcount> or
<vknotcount> are negative or greater that or equal to MAX_EVAL_ORDER.
INVALID_VALUE is generated if <uorder> > <uknotcount>+1 when any of
EvalCoord1[fd], EvalCoord1[fd]v, EvalPoint1, or EvalMesh1 are called if
both of MAP1_XXX and MAP1_XXX_NURBS_SGIX are enabled.
INVALID_VALUE is generated if <uorder> > <uknotcount>+1 or <vorder> >
<vknotcount>+1 when any of EvalCoord2[fd], EvalCoord2[fd]v, EvalPoint2, or
EvalMesh2 are called if both of MAP2_XXX and MAP2_XXX_NURBS_SGIX are
enabled.
New State
Initial
Get Value Get Command Type Value Attrib
--------- ----------- ---- ------- ------
MAP1_VERTEX_3_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_VERTEX_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_INDEX_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_COLOR_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_NORMAL_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_TEXTURE_COORD_1_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_TEXTURE_COORD_2_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_TEXTURE_COORD_3_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP1_TEXTURE_COORD_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_VERTEX_3_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_VERTEX_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_INDEX_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_COLOR_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_NORMAL_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_TEXTURE_COORD_1_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_TEXTURE_COORD_2_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_TEXTURE_COORD_3_NURBS_SGIX glIsEnabled B FALSE eval/enable
MAP2_TEXTURE_COORD_4_NURBS_SGIX glIsEnabled B FALSE eval/enable
NURBS_KNOT_COUNT_SGIX GetMapiv 9XZ+ 0
NURBS_KNOT_COUNT_SGIX GetMapiv 9X2XZ+ 0,0
NURBS_KNOT_VECTOR_SGIX GetMapdv 9X7*XR undef.
NURBS_KNOT_VECTOR_SGIX GetMapdv 9X2X7*XR undef.
New Implementation Dependent State
None