Point Cloud Library (PCL) 1.13.0
opennurbs_gl.h
1/* $NoKeywords: $ */
2/*
3//
4// Copyright (c) 1993-2011 Robert McNeel & Associates. All rights reserved.
5// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6// McNeel & Assoicates.
7//
8// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10// MERCHANTABILITY ARE HEREBY DISCLAIMED.
11//
12// For complete openNURBS copyright information see <http://www.opennurbs.org>.
13//
14////////////////////////////////////////////////////////////////
15*/
16
17////////////////////////////////////////////////////////////////
18//
19// Definitions of ON_GL() functions that demonstrate how to
20// use GL to display OpenNURBS objects.
21//
22////////////////////////////////////////////////////////////////
23
24#include "opennurbs.h"
25
26#if defined(ON_COMPILER_MSC)
27
28// Tested compilers:
29// Microsoft Developer Studio 6.0
30// Microsoft Visual Studio 2005
31// Support for other Windows compilers is not available.
32
33// Windows Open GL files require windows.h to be included before the
34// Open GL header files.
35#include <windows.h>
36#include <GL/gl.h> // Open GL basic definitions
37#include <GL/glu.h> // Open GL utilities (for GL NURBS stuff)
38
39#elif defined(ON_COMPILER_XCODE)
40
41// Tested compilers:
42// Apple XCode 2.4.1
43// Support for other Apple compilers is not available.
44#include <GLUT/glut.h> // Open GL auxillary functions
45
46#else
47
48// Unsupported compiler:
49// Support for other compilers is not available
50#include <GL/gl.h> // Open GL basic definitions
51#include <GL/glu.h> // Open GL utilities (for GL NURBS stuff)
52
53#endif
54
55
56#if !defined(OPENNURBS_GL_INC_)
57#define OPENNURBS_GL_INC_
58
59
60// Use ON_GL( const ON_Point, ...) to render single points.
61void ON_GL(
62 const ON_Point&
63 );
64
65// Use ON_GL( const ON_PointCloud, ...) to render Rhino point sets.
66void ON_GL(
67 const ON_PointCloud&
68 );
69
70// Use ON_GL( const ON_Mesh&, ...) to render OpenNURBS meshes.
71void ON_GL(
72 const ON_Mesh&
73 );
74
75// Use ON_GL( const ON_Brep&, ...) to render OpenNURBS b-reps.
76void ON_GL(
77 const ON_Brep&,
78 GLUnurbsObj*
79 );
80
81// must be bracketed by calls to glBegin(GL_POINTS) / glEnd()
82void ON_GL(
83 const ON_3dPoint&
84 );
85
86void ON_GL(
87 const ON_Curve&, //
88 GLUnurbsObj*, // created with gluNewNurbsRenderer
89 GLenum = 0, // type of curve (if 0, type is automatically set)
90 double[][4] = NULL // optional transformation applied to curve
91 );
92
93// must be bracketed by calls to gluBeginSurface( nobj )/gluEndSurface( nobj )
94void ON_GL(
95 const ON_Surface&, //
96 GLUnurbsObj* // created with gluNewNurbsRenderer
97 );
98
99// Use ON_GL( const ON_NurbsCurve&,...) in place of
100// gluNurbsCurve(). See your system's gluNurbsCurve() documentation
101// for details. In particular, for 3d curves the call to
102// ON_GL( const ON_NurbsCurve&, nobj,...) should appear inside
103// of a gluBeginCurve( nobj )/gluEndCurve( nobj ) pair.
104// Generally, the GL "type" should be set using the formula
105// ON_NurbsCurve:IsRational()
106// ? GL_MAP1_VERTEX_4
107// : GL_MAP1_VERTEX_3;
108void ON_GL(
109 const ON_NurbsCurve&, //
110 GLUnurbsObj*, // created with gluNewNurbsRenderer
111 GLenum = 0, // type of curve (if 0, type is automatically set)
112 int = 1, // bPermitKnotScaling - If true, curve knots may
113 // be rescaled to avoid knot vectors GL cannot handle.
114 double* = NULL, // knot_scale[2] - If not NULL and bPermitKnotScaling,
115 // the scaling applied to the knot vector is
116 // returned here.
117 double[][4] = NULL // optional transformation applied to curve
118 );
119
120void ON_GL( // low level NURBS curve renderer
121 int, int, int, int, // dim, is_rat, cv_count, order
122 const double*, // knot_vector[]
123 int, // cv_stride
124 const double*, // cv
125 GLUnurbsObj*, // created with gluNewNurbsRenderer
126 GLenum = 0, // type of curve (if 0, type is automatically set)
127 int = 1, // bPermitKnotScaling - If true, curve knots may
128 // be rescaled to avoid knot vectors GL cannot handle.
129 double* = NULL, // knot_scale[2] - If not NULL and bPermitKnotScaling,
130 // the scaling applied to the knot vector is
131 // returned here.
132 double[][4] = NULL // optional transformation applied to curve
133 );
134
135
136// Use ON_GL( const ON_NurbsSurface&,...) in place of
137// gluNurbsSurface(). See your system's gluNurbsSurface() documentation
138// for details. In particular, the call to
139// ON_GL( const ON_NurbsSurface&, nobj, ...) should appear inside
140// of a gluBeginSurface( nobj )/gluEndSurface( nobj ) pair.
141// Generally, the GL "type" should be set using the formula
142// ON_NurbsSurface:IsRational()
143// ? GL_MAP2_VERTEX_4
144// : GL_MAP2_VERTEX_3;
145void ON_GL(
146 const ON_NurbsSurface&, //
147 GLUnurbsObj*, // created with gluNewNurbsRenderer
148 GLenum = 0, // type of surface
149 // (if 0, type is automatically set)
150 int = 1, // bPermitKnotScaling - If true, surface knots may
151 // be rescaled to avoid knot vectors GL cannot handle.
152 double* = NULL, // knot_scale0[2] - If not NULL and bPermitKnotScaling,
153 // the scaleing applied to the first parameter is
154 // returned here.
155 double* = NULL // knot_scale0[2] - If not NULL and bPermitKnotScaling,
156 // the scaleing applied to the second parameter is
157 // returned here.
158 );
159
160
161// Use ON_GL( const ON_BrepFace&, nobj ) to render
162// the trimmed NURBS surface that defines a ON_Brep face's geometry.
163// The call to ON_GL( const ON_BrepFace&, nobj ) should
164// appear inside of a gluBeginSurface( nobj )/gluEndSurface( nobj )
165// pair.
166void ON_GL(
167 const ON_BrepFace&, //
168 GLUnurbsObj* // created with gluNewNurbsRenderer
169 );
170
171// Use ON_GL( const ON_Color ...) to set GL color to OpenNURBS color
172void ON_GL( const ON_Color&,
173 GLfloat[4]
174 );
175void ON_GL( const ON_Color&,
176 double, // alpha
177 GLfloat[4]
178 );
179
180// Use ON_GL( const ON_Material ...) to set GL material to OpenNURBS material
181void ON_GL(
182 const ON_Material&
183 );
184
185void ON_GL(
186 const ON_Material* // pass NULL to get OpenNURBS's default material
187 );
188
189// Use ON_GL( const ON_Light, ...) to add OpenNURBS spotlights to
190// GL lighting model
191void ON_GL(
192 const ON_Light*, // pass NULL to disable the light
193 GLenum // GL_LIGHTi where 0 <= i <= GL_MAX_LIGHTS
194 // See glLight*() documentation for details
195 );
196void ON_GL(
197 const ON_Light&,
198 GLenum // GL_LIGHTi where 0 <= i <= GL_MAX_LIGHTS
199 // See glLight*() documentation for details
200 );
201
202//////////////////////////////////////////////////////////////////////////
203// Use ON_GL( ON_Viewport& ... ) to set the GL projections to match
204// those used in the OpenNURBS viewport.
205
206////////////
207//
208// Use ON_GL( ON_Viewport&, in, int, int, int ) to specify the size of the
209// GL window and loads the GL projection matrix (camera to clip
210// transformation). If the aspect ratio of the GL window and
211// ON_Viewport's frustum do not match, the viewport's frustum is
212// adjusted to get things back to 1:1.
213//
214// For systems where the upper left corner of a window has
215// coordinates (0,0) use:
216// port_left = 0
217// port_right = width-1
218// port_bottom = height-1
219// port_top = 0
220void ON_GL( ON_Viewport&,
221 int, int, // port_left, port_right (port_left != port_right)
222 int, int // port_bottom, port_top (port_bottom != port_top)
223 );
224
225////////////
226//
227// Use ON_GL( ON_Viewport& ) to load the GL model view matrix (world to
228// camera transformation).
229void ON_GL( const ON_Viewport& );
230
231// Use ON_GL( order, cv_count, knot, bPermitScaling, glknot )
232// to create knot vectors suitable for GL NURBS rendering.
233void ON_GL(
234 const int, // order, ON_NurbsCurve... order
235 const int, // cv_count, ON_NurbsCurve... cv count
236 const double*, // knot, ON_NurbsCurve... knot vector
237 GLfloat*, // glknot[] - GL knot vector
238 int = 0, // bPermitScaling - true if re-scaling is allowed
239 double* = NULL // scale[2] - If not NULL and bPermitScaling is true,
240 // then the scaling parameters are returned here.
241 // ( glknot = (knot = scale[0])*scale[1] )
242 );
243
244#endif